Three.js - 自定义网格上的奇怪线条
Three.js - Strange lines on custom mesh
我正在尝试制作自定义网格以便在场景中有很多可自定义的平面。
这是一些代码:
geometry = new THREE.BufferGeometry();
geometry.addAttribute( 'position', new THREE.BufferAttribute( vertexPositions, 3 ).setDynamic( true ) );
geometry.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ).setDynamic( true ) );
geometry.addAttribute( 'opacity', new THREE.BufferAttribute( opacity, 1 ).setDynamic( true ) );
// Initialize material
var material = new THREE.ShaderMaterial( { vertexColors: THREE.VertexColors, transparent: true, vertexShader: vertexShader, fragmentShader: fragmentShader } );
// Create something like a Wireframe of the planes
var Pgeometry = new THREE.BufferGeometry();
Pgeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( ApointsPositions ), 3 ).setDynamic( true ) );
var points = new THREE.LineSegments( Pgeometry, new THREE.PointsMaterial( { color: 0x353535 } ) );
scene.add( points );
// Create planes and add to scene
planeMeshes = new THREE.Mesh( geometry, material );
planeMeshes.setDrawMode( THREE.TriangleStripDrawMode );
scene.add( planeMeshes );
我的自定义 material 工作正常,让我在每个顶点上使用不透明度。每个平面都已创建,一切正常。
问题是,当我渲染场景时,每个平面行上都有一些奇怪的线条,这是一个完整的工作代码笔:Codepen link
你看到那些对角线了吗?你能告诉我发生了什么事吗?我没找到他们的出处。
提前致谢!
您看到对角线的原因是因为您使用的是 THREE.TriangleStripDrawMode
,所以最右边的三角形与下一行最左边的三角形共享顶点。您会看到一个真正拉伸的三角形切面。
要解决此问题,请删除您分配 TriangleStripDrawMode
的行,这将恢复为每个三角形三个顶点的默认值(不共享顶点)。
问题二:
每次迭代的第一个三角形按顺时针顺序绘制,但每次迭代的第二个三角形按逆时针顺序绘制,因此除非更改顶点顺序,否则您将看不到第二个三角形顺时针
这是您在 Codepen 中的使用方式:
// Second tri is drawn counter-clockwise
AvertexPositions.push( x, y + 60, 0 ); //
AvertexPositions.push( x + 80, y + 60, 0 ); // Second triangle of a plane
AvertexPositions.push( x + 80, y, 0 );
应该是这样的:
// Now, it is clockwise, matching first tri
AvertexPositions.push( x, y + 60, 0 ); //
AvertexPositions.push( x + 80, y, 0 ); //
AvertexPositions.push( x + 80, y + 60, 0 ); // Second triangle of a plane
以相同的缠绕顺序绘制所有三角形很重要。否则,有的朝前,有的朝后。您可以选择渲染哪一侧,或使用 Materials.Side
渲染两侧
我正在尝试制作自定义网格以便在场景中有很多可自定义的平面。
这是一些代码:
geometry = new THREE.BufferGeometry();
geometry.addAttribute( 'position', new THREE.BufferAttribute( vertexPositions, 3 ).setDynamic( true ) );
geometry.addAttribute( 'color', new THREE.BufferAttribute( colors, 3 ).setDynamic( true ) );
geometry.addAttribute( 'opacity', new THREE.BufferAttribute( opacity, 1 ).setDynamic( true ) );
// Initialize material
var material = new THREE.ShaderMaterial( { vertexColors: THREE.VertexColors, transparent: true, vertexShader: vertexShader, fragmentShader: fragmentShader } );
// Create something like a Wireframe of the planes
var Pgeometry = new THREE.BufferGeometry();
Pgeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( ApointsPositions ), 3 ).setDynamic( true ) );
var points = new THREE.LineSegments( Pgeometry, new THREE.PointsMaterial( { color: 0x353535 } ) );
scene.add( points );
// Create planes and add to scene
planeMeshes = new THREE.Mesh( geometry, material );
planeMeshes.setDrawMode( THREE.TriangleStripDrawMode );
scene.add( planeMeshes );
我的自定义 material 工作正常,让我在每个顶点上使用不透明度。每个平面都已创建,一切正常。
问题是,当我渲染场景时,每个平面行上都有一些奇怪的线条,这是一个完整的工作代码笔:Codepen link
你看到那些对角线了吗?你能告诉我发生了什么事吗?我没找到他们的出处。
提前致谢!
您看到对角线的原因是因为您使用的是 THREE.TriangleStripDrawMode
,所以最右边的三角形与下一行最左边的三角形共享顶点。您会看到一个真正拉伸的三角形切面。
要解决此问题,请删除您分配 TriangleStripDrawMode
的行,这将恢复为每个三角形三个顶点的默认值(不共享顶点)。
问题二:
每次迭代的第一个三角形按顺时针顺序绘制,但每次迭代的第二个三角形按逆时针顺序绘制,因此除非更改顶点顺序,否则您将看不到第二个三角形顺时针
这是您在 Codepen 中的使用方式:
// Second tri is drawn counter-clockwise
AvertexPositions.push( x, y + 60, 0 ); //
AvertexPositions.push( x + 80, y + 60, 0 ); // Second triangle of a plane
AvertexPositions.push( x + 80, y, 0 );
应该是这样的:
// Now, it is clockwise, matching first tri
AvertexPositions.push( x, y + 60, 0 ); //
AvertexPositions.push( x + 80, y, 0 ); //
AvertexPositions.push( x + 80, y + 60, 0 ); // Second triangle of a plane
以相同的缠绕顺序绘制所有三角形很重要。否则,有的朝前,有的朝后。您可以选择渲染哪一侧,或使用 Materials.Side