【发布时间】:2014-03-12 18:31:38
【问题描述】:
我目前正在学习 webGL 和 three.js。因此,出于测试原因,我尝试创建一个平面几何图形和两个立方体几何图形以及一个点光源:
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 ); -
是的,太好了! geometry.computeFaceNormals();成功了!你能解释一下,为什么我需要打电话给这个? scene.add( new THREE.FaceNormalsHelper( floorMesh ); 不是必需的。如果我把它放到我的代码中,它会画一条黄线。我猜这条线是归一化正交向量的表示。
标签: javascript three.js