处理:创建两个3D框并旋转

时间:2014-12-10 14:19:49

标签: opengl rotation processing

我需要创建两个Box,它们都应以相同的速度以相同的速度旋转,只有它们的位置应该不同。我得到的就是:

http://i.stack.imgur.com/JMua9.png

我使用了以下代码:

float rotatevalue;
void setup()
{
  rotatevalue = 0;
    size(500, 500, OPENGL);
  if (frame != null) {
    frame.setResizable(true);
  } 
}

void draw()
{
    background(245, 238, 184);
    fill(246, 225, 65);
    rotatevalue = rotatevalue + 2;
    pushMatrix();
    translate(width/4, height/4);
    rotateX(radians(rotatevalue));
    rotateY(radians(rotatevalue));
    box(50);
    popMatrix();

    pushMatrix();
    translate(3*width/4, height/4);
    rotateX(radians(rotatevalue));
    rotateY(radians(rotatevalue));
    box(50);
    popMatrix();
}

使它们以不同方式旋转有什么问题?

2 个答案:

答案 0 :(得分:0)

我不习惯使用OpenGL矩阵堆栈,所以这可能有些偏离基础。我计算自己的模型矩阵传递给顶点着色器。当我这样做时,我会在翻译之前先进行轮换。

答案 1 :(得分:0)

如果你想在2D草图中绘制3D对象,你必须使用某种类型的投影,就像你的眼睛投射现实世界一样。有关详细信息,您应该详细了解perspectiveprojection

所以你的盒子以同样的方式旋转!我将尝试在这个基本示例上演示它。在这里你可以看到草图中间的5个方框:

void setup(){  
    size(500, 500, OPENGL);  
    fill(246, 225, 65);
    //ortho();
}

void draw(){
    background(245, 238, 184);   
    translate(width/2, height/2);    

    draw_box(0);
    draw_box(1);
    draw_box(2);
    draw_box(3);
    draw_box(4);
}

void draw_box(int pos){
    pushMatrix();       
    switch(pos){
      case 0: translate(   0,   0); break;
      case 1: translate(   0,-100); break;
      case 2: translate(   0, 100); break;
      case 3: translate( 100,   0); break;
      case 4: translate(-100,   0); break;
    }                  
    box(50);
    popMatrix();
}

没有轮换,所以它们应该相同?没有!它与铁路轨道相同=它们是平行的但是在远距离你几乎可以看到它们在触摸(img

您可以尝试使用正交投影来获取更多类似的框以获取更多信息,请参阅ortho。如果你想要更好的结果,你也应该更加中心化。