2016-05-17 96 views
0

我正在学习3D OpenGL。OpenGL Java 3D立方体旋转

我在看着bennybox的视频进行学习。 但现在我很困惑。

与他的教程视频相比,我的立方体似乎只有三面。

我试了几天,但还是不明白为什么?

benny's tutorial video Start watching at 19:37

mine program execution 1

矿魔方似乎已经不太两侧。

我想知道双方是否有颜色。

轮换代码:

public Matrix4f initRotation(float x, float y, float z) 
{ 
    Matrix4f rx = new Matrix4f(); 
    Matrix4f ry = new Matrix4f(); 
    Matrix4f rz = new Matrix4f(); 

    x = (float)Math.toRadians(x); 
    y = (float)Math.toRadians(y); 
    z = (float)Math.toRadians(z); 

    rz.m[0][0] = (float)Math.cos(z);rz.m[0][1] = -(float)Math.sin(z);rz.m[0][2] = 0;    rz.m[0][3] = 0; 
    rz.m[1][0] = (float)Math.sin(z);rz.m[1][1] = (float)Math.cos(z);rz.m[1][2] = 0;     rz.m[1][3] = 0; 
    rz.m[2][0] = 0;     rz.m[2][1] = 0;     rz.m[2][2] = 1;     rz.m[2][3] = 0; 
    rz.m[3][0] = 0;     rz.m[3][1] = 0;     rz.m[3][2] = 0;     rz.m[3][3] = 1; 

    rx.m[0][0] = 1;     rx.m[0][1] = 0;     rx.m[0][2] = 0;     rx.m[0][3] = 0; 
    rx.m[1][0] = 0;     rx.m[1][1] = (float)Math.cos(x);rx.m[1][2] = -(float)Math.sin(x);rx.m[1][3] = 0; 
    rx.m[2][0] = 0;     rx.m[2][1] = (float)Math.sin(x);rx.m[2][2] = (float)Math.cos(x);rx.m[2][3] = 0; 
    rx.m[3][0] = 0;     rx.m[3][1] = 0;     rx.m[3][2] = 0;     rx.m[3][3] = 1; 

    ry.m[0][0] = (float)Math.cos(y);ry.m[0][1] = 0;     ry.m[0][2] = -(float)Math.sin(y);ry.m[0][3] = 0; 
    ry.m[1][0] = 0;     ry.m[1][1] = 1;     ry.m[1][2] = 0;     ry.m[1][3] = 0; 
    ry.m[2][0] = (float)Math.sin(y);ry.m[2][1] = 0;     ry.m[2][2] = (float)Math.cos(y);ry.m[2][3] = 0; 
    ry.m[3][0] = 0;     ry.m[3][1] = 0;     ry.m[3][2] = 0;     ry.m[3][3] = 1; 

    m = rz.mul(ry.mul(rx)).getM(); 

    return this; 
} 

和进口box.obj:

o cube 
v 1.000000 -1.000000 -1.000000 
v 1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -0.999999 
v 0.999999 1.000000 1.000001 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
usemtl Material 
s off 
f 1 2 3 
f 1 3 4 
f 5 8 7 
f 5 7 6 
f 1 5 6 
f 1 6 2 
f 2 6 7 
f 2 7 3 
f 3 7 8 
f 3 8 4 
f 5 1 4 
f 5 4 8 
+0

看起来您没有设置您的视图/投影矩阵,您只是旋转了立方体,但没有正确定位立方体或相机。 –

+0

我认为我的想法是正确的.......在添加投影之后,我确实没有立方体的某些边。但我仍然无法弄清楚为什么。我的新视频[Cube less sides](https://www.youtube.com/watch?v=nIqgTVD-zuk) – Kenny

回答

0

在视频中,可以看到一些面反转(你只能看到他们的内部立方体)。这意味着在你的代码中的某个地方,脸部索引的顺序是顺时针而不是逆时针(或者反过来)。默认情况下,OpenGL只显示脸部的一面,这种技术称为“脸部剔除”。

尝试使用不同的cube .obj模型,例如下面的模型。如果这没有帮助,则必须通过处理.obj文件的所有代码并最终使用OpenGL进行显示。

o cube 
v 0.0 0.0 0.0 
v 0.0 0.0 -1.0 
v 0.0 -1.0 0.0 
v 0.0 -1.0 -1.0 
v -1.0 0.0 0.0 
v -1.0 0.0 -1.0 
v -1.0 -1.0 0.0 
v -1.0 -1.0 -1.0 
usemtl Material 
s off 
f 1 7 5 
f 1 3 7 
f 1 4 3 
f 1 2 4 
f 3 8 7 
f 3 4 8 
f 5 7 8 
f 5 8 6 
f 1 5 6 
f 1 6 2 
f 2 6 8 
f 2 8 4 
+0

对不起。我一直都很忙。我已经搜索了学习OpenGL,所以我知道你的意思是顺时针和逆时针。但我并没有用翻转搅拌器中的反面来得到它。 – Kenny

+0

@Kenny我用新建议编辑了我的答案。 – Fons

+0

你的意思是我应该试试这个模型,忽略向量正常和1 // 2变成2 7 // 2变成14? – Kenny