2011-08-29 33 views
5

首先,我想为这么长的问题道歉。你不必阅读它。您可以直接跳到问题部分,然后根据需要查找详细信息(我尽量提供尽可能多的信息,因为根据我的经验,太多的代码比太少的代码要好)。所以,...关于三角卷绕和转换的困惑

我对三角形缠绕和转换有点困惑,我认为我理解。我想提请其定义如下立方体:

const float a = 0.5f; //half of the cube side length 
    float positions[nComponents] = 
    { 
     //front face 
     -a, -a, -a, 
     a, -a, -a, 
     a, a, -a, 

     -a, -a, -a, 
     a, a, -a, 
     -a, a, -a, 

     //back face 
     -a, -a, a, 
     a, a, a, 
     a, -a, a, 

     -a, -a, a, 
     -a, a, a, 
     a, a, a, 

     //up face 
     -a, a, -a, 
     a, a, -a, 
     a, a, a, 

     -a, a, -a, 
     a, a, a, 
     -a, a, a, 

     //down face 
     -a, -a, -a, 
     a, -a, a, 
     a, -a, -a, 

     -a, -a, -a, 
     -a, -a, a, 
     a, -a, a, 

     //right face 
     a, -a, -a, 
     a, -a, a, 
     a, a, a, 

     a, -a, -a, 
     a, a, a, 
     a, a, -a, 

     //left face 
     -a, -a, -a, 
     -a, a, a, 
     -a, -a, a, 

     -a, -a, -a, 
     -a, a, -a, 
     -a, a, a, 
    }; 

而且这些都是我的面的所谓颜色:

float face_colors[nFaces * dim] = 
{ 
    1,0,0, //front RED 
    1,1,1, //back WHITE 
    0,0,1, //up BLUE 
    0,1,1, //down SKY BLUE 
    0,1,0, //right GREEN 
    1,1,0, //left YELLOW 
}; 

正如您从注释中看到的,我用的术语了,向下,向左,向右等。如果我们假设我们正在查看世界坐标​​中位置的立方体,例如(0, 0, -3a),则这些单词可以获得它们的含义。现在,据我所知,我的立方体的正面是顺时针方向缠绕的(也就是说,如果我们从它外面的任何位置查看立方体,并列举我们看到的三角形中的顶点,我们将得到逆时针缠绕) 。

所以,我需要1.启用剔除。 2.说逆时针是正面3.缩回面。这是代码为:

glEnable(GL_DEPTH_TEST); 
glEnable(GL_CULL_FACE); 
glFrontFace(GL_CCW); 
glCullFace(GL_BACK); 

我的投影矩阵是一个透视投影矩阵,模型视图矩阵只是注视矩阵。它们作为制服送入顶点着色器。

ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f); 
glm::vec3 center(0.0f, 0.0f, 0.0f); 
glm::vec3 eye(1.0f, 2.0f, -3.0f); 
glm::vec3 up(0.0f, 1.0f, 0.0f); 
ModelViewMatrix = glm::lookAt(eye, center, up); 
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix)); 
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix)); 

我的顶点着色器的定义如下:

#version 400 
layout(location = 0) in vec4 vVertex; 
layout(location = 1) in vec4 vColor; 
uniform mat4 P; 
uniform mat4 MV; 
out vec4 vFragColor; 
void main(void) 
{ 
    vFragColor = vColor; 
    gl_Position = P * MV * vVertex; 
} 

我的片段着色器是微不足道的 - 它只是输出经内插的色彩。

现在...这里是我得到的输出:

enter image description here

如果我改变glFrontFace(GL_CCW);glFrontFace(GL_CW);,或者改变glCullFace(GL_BACK)glCullFace(GL_FRONT),我得到预期的(至少超过预期前一个,见第二和第三quesions)渲染:

enter image description here

我在这里看到了三个问题,EA CH在一个问题描述:

实际问题:

Q1:为什么是我所想要的绕组相反?我没有逆时针为正面绕顶点?
Q2为什么我的“左”脸和“右”脸转换位置?左脸应该是黄色的,右边的脸是绿色的,反之亦然!我的转型有什么问题?
Q3 There is我的转换出了点问题,因为我的眼图向量的x坐标是正值,这意味着我实际上应该看到右侧的一点,而不是左侧的一点!

我已经问过这些问题了,因为我认为它们都是连接的,可能还有一些非常基本的东西,我错过了。非常感谢您花时间澄清这些事情。

回答

9

OpenGL默认采用右手坐标系,即指向屏幕外的正Z轴。你的立方体顶点位置表明你正在假设一个左手坐标系。然而,如果你将这些值放入RHS,那么你的LHS-逆时针坐标变为顺时针(1),一个坐标轴上的面交换位置(2),并且假定的眼睛变换将进入相反的方向(3)。

+1

我还是很困惑。但是我喜欢我不能自由地定义我的“世界”坐标系吗? LookAt函数以世界坐标为向量,不是?那么它与默认的Z轴方向有什么不同? –

+1

啊......我想我现在开始了......即使在世界坐标系统中,我也无法改变三轴的相对***配置。是对的吗? –

+3

@阿门是的就是这样。你可以通过(1,1,-1)来缩放你的模型视图矩阵,并且因此镜像z轴来假设你想要的左手系统,但是我不会建议这样做,因为它可能就像是围绕de-一个右手系统的事实标准。 –