Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript three.js lambert材质颜色不显示_Javascript_Three.js - Fatal编程技术网

Javascript three.js lambert材质颜色不显示

Javascript three.js lambert材质颜色不显示,javascript,three.js,Javascript,Three.js,我用自己的顶点和索引创建了一个箭头,然后将lambert材质和材质颜色设置为红色。我在渲染时看不到材质颜色。只是黑色的 但是,如果将“材质”设置为“基本材质”,则可以看到颜色 arrowMesh = new THREE.Mesh( arrowGeometry, new THREE.MeshLambertMaterial({ color : 'red', side: THREE.DoubleSide }) ); arrowMesh.position.set(-10,5,95); a

我用自己的顶点和索引创建了一个箭头,然后将lambert材质和材质颜色设置为红色。我在渲染时看不到材质颜色。只是黑色的

但是,如果将“材质”设置为“基本材质”,则可以看到颜色

arrowMesh = new THREE.Mesh(
    arrowGeometry,
    new THREE.MeshLambertMaterial({ color : 'red', side: THREE.DoubleSide })
);
arrowMesh.position.set(-10,5,95);
arrowMesh.rotation.x = -1.0;

arrowMesh.rotation.z = -0.2;
scene.add(arrowMesh);

three.js r64

我这样解决了我的问题

var ground_texture = THREE.ImageUtils.loadTexture('images/grass.png', {}, function() {
    renderer.render(scene,camera);
});
ground_material = Physijs.createMaterial(
    new THREE.MeshLambertMaterial({map : ground_texture}),
    .9, // high friction
    .9 // low friction
);

我在这个网站上找到了这个解决方案

首先,使用
THREE.LambertMaterial
时,场景中需要一些灯光

如果场景中确实有灯光,并且通过创建顶点和面自己创建了几何体,那么问题很可能在于面法线设置为
Vector3(0,0,0)

计算并设置你的脸法线,它们应该正确渲染

因此,对于单个三角形,它将如下所示:

var geometry = new THREE.Geometry();
geometry.vertices = [ a, b, c ];

var face = new THREE.Face3( 0, 1, 2 );

face.normal = new THREE.Vector3().crossVectors(
    new THREE.Vector3().subVectors( b, a ),
    new THREE.Vector3().subVectors( c, b )
).normalize();

var mesh = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial({color: 0xff0000, side: 2, shading: THREE.FlatShading}));
也可以使用几何体方法来计算它们,而不是手动执行此操作:

geometry.computeFaceNormals();
geometry.computeVertexNormals();

我在我的机器上遇到了同样的问题,并发现PointLight是罪魁祸首。将“距离”设置为零(或保留默认值)会导致灯光完全关闭。显式地将“距离”设置为一个较大的数字会打开灯光,然后我的所有Lambert材质都会正常显示

因此,与其

pointLight = new THREE.PointLight(0xFFFFFF);
我曾经

pointLight = new THREE.PointLight(0xFFFFFF, 1, 100000);

一切都是固定的。据我所知,到目前为止,这个问题仅限于PointLight,并且依赖于机器(GPU或GPU驱动程序,不确定具体是哪个)。但是,在那里输入一个大数字并避免问题是很容易的。

如果几何体是
3,颜色是否显示为红色。立方几何体
?几何体不是3。立方几何体是3。几何体。请将
箭头几何体
替换为
3。立方几何体
,然后回答我原来的问题。它不起作用。“还是黑色的,我的箭形断掉了。”@kocyigityunus:很高兴看到你解决了自己的问题。请将解决方案作为答案发布,并将其标记为。这不应该发生。你正在使用什么版本的three.js?我相信是71版。如果你能像你所描述的那样演示three.js错误,如果你能报告它,那会很有帮助。请参阅中的“如何报告错误”。我将在下周尝试这样做。顺便说一下,我会注意到,即使是MeshLambertMaterial文档页面顶部的演示对我来说也是黑色的。是的。在我的机器上是黑色的。这是如何回答最初的问题的?