我目前正在学习webGL和three.js。因此,对于测试的原因,我试图创建一个平面几何和两个立方体的几何形状和点光源:three.js - 使用MeshLambertMaterial和点光源绘制自定义网格
function initLights() {
var c = context;
var pointLight = new THREE.PointLight(0xffffff, 1, 100);
pointLight.position.set(10, 10, 10);
c.scene.add(pointLight);
}
function initObjects() {
var c = context;
/**
* Defining the materials
*/
var lambertRedMaterial = new THREE.MeshLambertMaterial({
color : 0xff0000
, side : THREE.DoubleSide
});
var lambertWhiteMaterial = new THREE.MeshLambertMaterial({
color : 0xffffff
, side : THREE.DoubleSide
});
/**
* Defining the floor
*/
var floorGeometry = new THREE.Geometry();
floorGeometry.vertices.push(new THREE.Vector3(-5.0, 0.0, -5.0));
floorGeometry.vertices.push(new THREE.Vector3(5.0, 0.0, -5.0));
floorGeometry.vertices.push(new THREE.Vector3(5.0, 0.0, 5.0));
floorGeometry.vertices.push(new THREE.Vector3(-5.0, 0.0, 5.0));
floorGeometry.faces.push(new THREE.Face3(2, 1, 0));
floorGeometry.faces.push(new THREE.Face3(3, 2, 0));
var floorMesh = new THREE.Mesh(floorGeometry, lambertWhiteMaterial);
floorMesh.position.set(0.0, 0.0, 0.0);
/**
* Defining a cube
*/
var cubeGeometry1 = new THREE.CubeGeometry(2.0,0.25,1);
var cube1 = new THREE.Mesh(cubeGeometry1, lambertRedMaterial);
cube1.position.set(0.0, 1.0, 0.0);
var cubeGeometry2 = new THREE.CubeGeometry(2.0,0.25,1);
var cube2 = new THREE.Mesh(cubeGeometry2, lambertRedMaterial);
cube2.position.set(0.0, 1.35, 0.0);
c.scene.add(floorMesh);
c.scene.add(cube1);
c.scene.add(cube2);
}
带有摄像头的背景和场面中定义。 奇怪的是,立方体显示正确,但飞机不显示。
当我将平面的y位置设置为1.0时,我可以看到它与下面的立方体相交。此外,它显示在我使用MeshBasicMaterial时,但我想使用MeshLambertMaterial出于照明原因。
有没有人有一个想法,如果我忘记了什么,或者会出现什么问题?
非常感谢提前。
作为开始,调用'geometry.computeFaceNormals();'。然后调用'scene.add(new THREE.FaceNormalsHelper(floorMesh);' – WestLangley
是的,太棒了!geometry.computeFaceNormals();做了诡计!你能解释一下吗,为什么我需要调用它? scene.add新的THREE.FaceNormalsHelper(floorMesh);不是必须的,如果我把它放到我的代码中,它会画出一条黄线,我猜这条线是归一化正交向量的表示形式 –