THREE.JS - 两张脸相交处的毛刺线
THREE.JS - Glitched lines at two face's intersection
我目前正在开发像 JavaScript 这样的体素 Minecraft 游戏来提高我的 JS/TS 技能,但我遇到了一个问题。
我通过在 BufferGeometry 中绘制块的多个面来绘制我的体素,但是在两个面之间,有一条像这张图片中那样的故障线。
以下是我的代码的某些部分,可能有助于了解问题的根源:
我的material:
const texture = loader.load(this.instance.ressourceMapUrl);
texture.magFilter = THREE.NearestFilter;
texture.minFilter = THREE.NearestFilter;
const material = this.blockMaterial = new THREE.MeshLambertMaterial({
map: texture,
alphaTest: 0.1,
transparent: true,
vertexColors: THREE.VertexColors
});
我的 BufferGeometry:
const geometry = new THREE.BufferGeometry();
const positionNumComponents = 3;
geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(positions), positionNumComponents));
const normalNumComponents = 3;
geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), normalNumComponents));
const uvNumComponents = 2;
geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), uvNumComponents));
geometry.setIndex(indices);
geometry.colors = new Float32Array(colors);
geometry.setAttribute( 'color', new THREE.BufferAttribute( geometry.colors, 3, true) );
geometry.computeBoundingSphere();
一个普通块的顶点样本:
[0, 12, 0, 0, 12, 1, 1, 12, 0, 1, 12, 1, 1, 12, 0, 1, 12, 1, 2, 12, 0, 2, 12, 1, 2, 12, 0, 2, 12, 1, 3, 12, 0, 3, 12, 1, 3, 12, 0, 3, 12, 1, 4, 12, 0, 4, 12, 1, 4, 12, 0, 4, 12, 1, 5, 12, 0, 5, 12...]
顶点按以下顺序使用:
let ndx = positions.length/3;
indices.push(
ndx, ndx + 1, ndx + 2,
ndx + 2, ndx + 1, ndx + 3,
);
我的远近变量:
const near = 0.101;
const far = 240
非常感谢您阅读本文,我知道这可能是个白痴问题,但我为此苦苦挣扎了一个星期,无法在网上找到任何解决方案。
祝你有愉快的一天。
我发现了问题以及如何解决它:
这是来自我的纹理。由于浮点数不精确,它正在制作这些线。
为了解决这个问题,我将用于纹理的角向中心移动了 0.0001。
纹理贴图中的纹理坐标存储如下:[x1, y1 x2, y2]。
我这样做了:
let uv: [number, number, number, number] = ...;
let correction = uv[0] > uv[2] ? 0.0001 : -0.0001;
uv[0] -= correction;
uv[2] += correction;
correction = uv[1] > uv[3] ? 0.0001 : -0.0001;
uv[1] -= correction;
uv[3] += correction;
感谢所有试图帮助我的人,我希望它也能帮助其他人!
我目前正在开发像 JavaScript 这样的体素 Minecraft 游戏来提高我的 JS/TS 技能,但我遇到了一个问题。
我通过在 BufferGeometry 中绘制块的多个面来绘制我的体素,但是在两个面之间,有一条像这张图片中那样的故障线。
以下是我的代码的某些部分,可能有助于了解问题的根源:
我的material:
const texture = loader.load(this.instance.ressourceMapUrl);
texture.magFilter = THREE.NearestFilter;
texture.minFilter = THREE.NearestFilter;
const material = this.blockMaterial = new THREE.MeshLambertMaterial({
map: texture,
alphaTest: 0.1,
transparent: true,
vertexColors: THREE.VertexColors
});
我的 BufferGeometry:
const geometry = new THREE.BufferGeometry();
const positionNumComponents = 3;
geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(positions), positionNumComponents));
const normalNumComponents = 3;
geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), normalNumComponents));
const uvNumComponents = 2;
geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), uvNumComponents));
geometry.setIndex(indices);
geometry.colors = new Float32Array(colors);
geometry.setAttribute( 'color', new THREE.BufferAttribute( geometry.colors, 3, true) );
geometry.computeBoundingSphere();
一个普通块的顶点样本:
[0, 12, 0, 0, 12, 1, 1, 12, 0, 1, 12, 1, 1, 12, 0, 1, 12, 1, 2, 12, 0, 2, 12, 1, 2, 12, 0, 2, 12, 1, 3, 12, 0, 3, 12, 1, 3, 12, 0, 3, 12, 1, 4, 12, 0, 4, 12, 1, 4, 12, 0, 4, 12, 1, 5, 12, 0, 5, 12...]
顶点按以下顺序使用:
let ndx = positions.length/3;
indices.push(
ndx, ndx + 1, ndx + 2,
ndx + 2, ndx + 1, ndx + 3,
);
我的远近变量:
const near = 0.101;
const far = 240
非常感谢您阅读本文,我知道这可能是个白痴问题,但我为此苦苦挣扎了一个星期,无法在网上找到任何解决方案。
祝你有愉快的一天。
我发现了问题以及如何解决它: 这是来自我的纹理。由于浮点数不精确,它正在制作这些线。
为了解决这个问题,我将用于纹理的角向中心移动了 0.0001。
纹理贴图中的纹理坐标存储如下:[x1, y1 x2, y2]。 我这样做了:
let uv: [number, number, number, number] = ...;
let correction = uv[0] > uv[2] ? 0.0001 : -0.0001;
uv[0] -= correction;
uv[2] += correction;
correction = uv[1] > uv[3] ? 0.0001 : -0.0001;
uv[1] -= correction;
uv[3] += correction;
感谢所有试图帮助我的人,我希望它也能帮助其他人!