【发布时间】:2012-08-11 08:21:10
【问题描述】:
我想为 THREE.js 球体的每个面赋予它自己的纹理。所以我让 SphereGeometry 计算顶点并使用面的顶点将每个面转换为 PlaneGeometry。
THREE.SpherePlaneGeometry = function ( v1, v2, v3, v4 ) {
THREE.Geometry.call( this );
var normal = new THREE.Vector3( 0, 1, 0 );
this.vertices.push( v1.clone() );
this.vertices.push( v2.clone() );
this.vertices.push( v3.clone() );
this.vertices.push( v4.clone() );
var face = new THREE.Face4( 0, 1, 2, 3 );
face.normal.copy( normal );
face.vertexNormals.push( normal.clone(), normal.clone(), normal.clone(), normal.clone() );
this.faces.push( face );
var uvs = [
new THREE.UV( 1.0, 0.0 ),
new THREE.UV( 0.0, 0.0 ),
new THREE.UV( 0.0, 1.0 ),
new THREE.UV( 1.0, 1.0 ),
];
this.faceVertexUvs[ 0 ].push( uvs );
};
确保所有这些都在稍后使用返回的几何图形运行:
geometry.computeCentroids();
geometry.computeFaceNormals();
geometry.verticesNeedUpdate = true;
geometry.uvsNeedUpdate = true;
geometry.normalsNeedUpdate = true;
geometry.tangentsNeedUpdate = true;
geometry.elementsNeedUpdate = true;
geometry.dynamic = true;
通过应用这个纹理:
我得到了这个结果:
可以做些什么来消除红点和绿点之间的失真?对于极点,一个顶点被使用了两次,但它可能会更好,知道吗?
【问题讨论】:
-
看起来这是一个类似的问题:stackoverflow.com/questions/6046929/…,更一般的是:如何纹理投影的四边形?但是,有没有使用 THREE.js 的解决方案?
-
正如 noiv 所说,似乎顶部四边形的三角测量错误,我建议为每个四边形制作一个中间点并制作 4 个三角形,然后尝试使用纹理......甚至可以使用 u ,v 的 phi 和 delta 覆盖整个球体并使用某种重复因子...
-
@EliSherer,overtesselation 可以解决这个问题,但多边形数量应该保持不变。另一种称为投影插值的方法被排除在外,因为它将问题移动到四边形的边缘:reedbeta.com/blog/2012/05/26/quadrilateral-interpolation-part-1
标签: javascript textures three.js