【发布时间】:2023-04-02 09:51:01
【问题描述】:
在a previous question 中,我希望将立体投影映射到球体上,以便实时流式传输虚拟现实事件。
我最终学到了很多关于 UV 映射的知识,并且能够构建一个非常精确的映射,看起来令人难以置信。但是,我不喜欢这种映射方法的一点:球体的底部必须映射到“无”,所以我将它映射到纹理的一角。
为了改进此解决方案,我尝试通过调整每个 Three.JS documentation on SphereGeometry 的 theta 长度来仅创建部分球体。
虽然我得到了正确的球体形状,但我注意到 UV 映射有些奇怪:
var fov = 270;
var geometry = new THREE.SphereGeometry(
1, // Radius
50, // Horizontal segments
50, // Vertical segments
0, // Phi start
2 * Math.PI, // Phi length
Math.acos((360 - fov) * Math.PI / 180 / 2), // Theta start
Math.PI - Math.acos((360 - fov) * Math.PI / 180 / 2) // Theta length
);
var minX, minY, minZ, maxX, maxY, maxZ;
var faceVertexUvs = geometry.faceVertexUvs[0];
for ( var i = 0; i < faceVertexUvs.length; i++ ) {
var face = geometry.faces[i];
for ( var j = 0; j < 3; j ++ ) {
var x = face.vertexNormals[j].x;
var y = face.vertexNormals[j].y;
var z = face.vertexNormals[j].z;
// Capture the upper and lower bounds for all points
if (!minX || x < minX) minX = x;
if (!maxX || x > maxX) maxX = x;
if (!minY || y < minY) minY = y;
if (!maxY || y > maxX) maxY = y;
if (!minZ || z < minZ) minZ = z;
if (!maxZ || z > maxZ) maxZ = z;
}
}
console.log("minX: " + minX + ", maxX: " + maxX);
console.log("minY: " + minY + ", maxY: " + maxY);
console.log("minZ: " + minZ + ", maxZ: " + maxZ);
我之前在执行 UV 映射时了解到,x、y 和 z 的值范围从 -1 到 1 - 无论网格的实际大小如何。如果球体的半径为 1 或半径为 100,则 x 值为 1 表示“球体的最右侧”,y 值为 1 表示“球体的顶部”。然而,当我有一个这样的不完整球体时(使用thetaStart 和thetaLength 在球体顶部切一个洞)突然maxY 等于大约0.7854。
为什么这个网格以 0.7854 结束,而不是从 -1 缩放到 1?我曾希望通过改变球体的形状来简化我的 UV 映射逻辑(从我之前链接的问题中删除 scaledY 术语)但是改变球体的形状似乎有 no 影响 UV 贴图。
有没有办法告诉 Three.JS 这个部分球体是完整的形状,它的坐标应该在 -1 到 1 的范围内?
【问题讨论】:
标签: javascript 3d three.js