首先,应该为其他人指出您正在尝试使用JavaScript库“three.js”进行开发。文档可以在这里找到:http://mrdoob.github.com/three.js/docs
问题的症结在于纹理根据存储在几何对象中的UV坐标映射到Mesh对象。对象THREE.CubeGeometry
的UV坐标存储在数组faceVertexUvs
中。
它包含UV的下面阵列在每一个6个面的坐标为4个顶点:
{{0,1}, {0,0}, {1,0}, {1,1}}, // Right Face (Top of texture Points "Up")
{{0,1}, {0,0}, {1,0}, {1,1}}, // Left Face (Top of texture Points "Up")
{{0,1}, {0,0}, {1,0}, {1,1}}, // Top Face (Top of texture Points "Backward")
{{0,1}, {0,0}, {1,0}, {1,1}}, // Bottom Face (Top of texture Points "Forward")
{{0,1}, {0,0}, {1,0}, {1,1}}, // Front Face (Top of texture Points "Up")
{{0,1}, {0,0}, {1,0}, {1,1}} // Back Face (Top of texture Points "Up") **Culprit**
据映射UV坐标的每个构成该立方体的面,它们是:
{0, 2, 3, 1}, // Right Face (Counter-Clockwise Order Starting RTF)
{4, 6, 7, 5}, // Left Face (Counter-Clockwise Order Starting LTB)
{4, 5, 0, 1}, // Top Face (Counter-Clockwise Order Starting LTB)
{7, 6, 3, 2}, // Bottom Face (Counter-Clockwise Order Starting LBF)
{5, 7, 2, 0}, // Front Face (Counter-Clockwise Order Starting LTF)
{1, 3, 6, 4} // Back Face (Counter-Clockwise Order Starting RTB)
以上数字是索引到顶点的阵列,这对于THREE.CubeGeometry
存储在vertices
,有8其中:
{20, 20, 20}, // Right-Top-Front Vertex
{20, 20, -20}, // Right-Top-Back Vertex
{20, -20, 20}, // Right-Bottom-Front Vertex
{20, -20, -20}, // Right-Bottom-Back Vertex
{-20, 20, -20}, // Left-Top-Back Vertex
{-20, 20, 20}, // Left-Top-Front Vertex
{-20, -20, -20}, // Left-Bottom-Back Vertex
{-20, -20, 20} // Left-Bottom-Front Vertex
注:所有的相对方向的上方假设摄影机沿看往中心在原点的立方体正z轴放置。
所以真正的罪魁祸首是纹理的顶点向上的背面。在这种情况下,您希望纹理的顶部在背面朝下指向,所以当多维数据集由于旋转而翻转倒转并查看您拥有它的方式时,图像会像您期望的那样显示。它需要改变如下:
{{1,0}, {1,1}, {0,1}, {0,0}} // FIXED: Back Face (Top of texture Points "Down")
这种变化可以在代码中改变坐标以获得显示器让你想:
var cubeGeometry = new THREE.CubeGeometry(40, 40, 40);
cubeGeometry.faceVertexUvs[0][5] = [new THREE.UV(1, 0), new THREE.UV(1, 1), new THREE.UV(0, 1), new THREE.UV(0, 0)];
var cube = new THREE.Mesh(cubeGeometry, img2);
对于进一步的阅读,我推荐以下链接使用UV坐标的纹理贴图http://www.rozengain.com/blog/2007/08/26/uv-coordinate-basics/。
你的“相关”的代码似乎并没有被这个问题非常相关......看你提供的链接,这似乎腥:'相机=新THREE.CombinedCamera(window.innerWidth/2,window.innerHeight/2,70,1,1000,-1000,1000,1000);'为什么其中一个值为负值? – Ozzy