2015-02-23 25 views
1

我寫了一個程序,可以創建一個當前包含三角形的房間。我想製作更多像這個三角形的物體,但我也想增加一些功能,讓我可以通過點擊它們並拖動它們來移動物體。我認爲最好的辦法是創建一些模板/原型等等,它們通過構造函數傳遞幾何數據,但有一個鼠標移動它的功能,但我不確定是否正確,而且我不完全確定我真的需要做些什麼來實現這樣的工作。這裏是我當前的代碼,它允許使用方向鍵旋轉場景,但我不確定如何製作它,所以我可以點擊一個對象並在此處拖動它(我開始嘗試將此註釋掉因爲我不認爲這是可行的,但如果它讓我知道如何):使用過剩,我該如何做到這一點,我可以通過點擊並拖動它來移動場景中的對象?

#include <stdio.h> 
#include <stdarg.h> 
#include <math.h> 
#include <stdlib.h> 
#include <GL/glut.h> 


void display(); 
void viewButtons(); 

//const double ZoomSTEP = 0.2; 
//const double zoomFactor = 1.03; 
double rotationY = 0; 
double rotationX = 0; 
// Mouse positions, normalized to [0,1]. 
//double xMouse = 0.5; 
//double yMouse = 0.5; 

//GLdouble startView = 2.0; 

void display() 
{ 
//Clear the screen and clear z-buffer 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// Reset transformations 
glLoadIdentity(); 

// Rotate when user changes rotate_x and rotate_y 
glRotatef(rotationX, 1.0, 0.0, 0.0); 
glRotatef(rotationY, 0.0, 1.0, 0.0); 
glBegin(GL_POLYGON); 
//Vertices and colors 
glColor3f(1.0, 0.0, 0.0);  
glVertex3f(0.5, -0.5, 0.5);  // P1 is red 
glColor3f(0.0, 1.0, 0.0);  
glVertex3f(0.5, 0.5, 0.5);  // P2 is green 
glColor3f(0.0, 0.0, 1.0);  
glVertex3f(-0.5, 0.5, 0.5);  // P3 is blue 
glColor3f(1.0, 0.0, 1.0);  
glVertex3f(-0.5, -0.5, 0.5);  // P4 is purple 

glEnd(); 

/*// White side - BACK 
glBegin(GL_POLYGON); 
glColor3f(1.0, 1.0, 1.0); 
glVertex3f(0.5, -0.5, 0.5); 
glVertex3f(0.5, 0.5, 0.5); 
glVertex3f(-0.5, 0.5, 0.5); 
glVertex3f(-0.5, -0.5, 0.5); 
glEnd();*/ 

// Purple side - RIGHT 
glBegin(GL_POLYGON); 
glColor3f(1.0, 0.0, 1.0); 
glVertex3f(0.5, -0.5, -0.5); 
glVertex3f(0.5, 0.5, -0.5); 
glVertex3f(0.5, 0.5, 0.5); 
glVertex3f(0.5, -0.5, 0.5); 
glEnd(); 

// Green side - LEFT 
glBegin(GL_POLYGON); 
glColor3f(0.0, 1.0, 0.0); 
glVertex3f(-0.5, -0.5, 0.5); 
glVertex3f(-0.5, 0.5, 0.5); 
glVertex3f(-0.5, 0.5, -0.5); 
glVertex3f(-0.5, -0.5, -0.5); 
glEnd(); 

// Blue side - TOP 
glBegin(GL_POLYGON); 
glColor3f(0.0, 0.0, 1.0); 
glVertex3f(0.5, 0.5, 0.5); 
glVertex3f(0.5, 0.5, -0.5); 
glVertex3f(-0.5, 0.5, -0.5); 
glVertex3f(-0.5, 0.5, 0.5); 
glEnd(); 

// Red side - BOTTOM 
glBegin(GL_POLYGON); 
glColor3f(1.0, 0.0, 0.0); 
glVertex3f(0.5, -0.5, -0.5); 
glVertex3f(0.5, -0.5, 0.5); 
glVertex3f(-0.5, -0.5, 0.5); 
glVertex3f(-0.5, -0.5, -0.5); 
glEnd(); 

glBegin(GL_POLYGON); 
glColor3f(0.5, 0.6, 0.3); 
glVertex3f(0.3, 0.1, 0.5); 
glVertex3f(0.4, 0.1, 0.5); 
glVertex3f(0.2, -0.2, 0.1); 
glEnd(); 

glFlush(); 
glutSwapBuffers(); 


} 

void viewButtons(int button, int x, int y) 
{ 
if (button == GLUT_KEY_RIGHT) 
    rotationY += 5; 

else if (button == GLUT_KEY_LEFT) 
    rotationY -= 5; 

else if (button == GLUT_KEY_UP) 
    rotationX += 5; 

else if (button == GLUT_KEY_DOWN) 
    rotationX -= 5; 

//update display 
glutPostRedisplay(); 
} 

int main(int argc, char **argv) { 

// init GLUT and create window 

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); 

glutInitWindowPosition(100, 100); 
glutInitWindowSize(720, 640); 
glutCreateWindow("Room with objects"); 

// register callbacks 
glutDisplayFunc(display); 
glutSpecialFunc(viewButtons); 
glEnable(GL_DEPTH_TEST); 
// enter GLUT event processing cycle 
glutMainLoop(); 

return 1; 
} 
+1

你的問題是什麼? – 2015-02-23 22:08:32

+0

答案很複雜,涉及從屏幕回溯光線,所以我指的是一個實際上可以完整回答問題的學術資源。 http://www.cs.utah.edu/~shirley/books/fcg2/rt.pdf – BlamKiwi 2015-02-23 22:10:22

+0

@MorphingDragon這似乎比它應該更復雜。我想要做的只是點擊我的三角形並將其拖到窗口的不同部分。 – cluemein 2015-02-23 22:20:21

回答

2

如果要轉/旋轉/縮放任意對象爲這個模板是這樣的:

  1. 保存您當前的世界矩陣(您可以使用glPushMatrix來完成)
  2. 將您的對象轉換爲您想要的位置(使用glRotate/glTranslate/glScale)
  3. 吸引你的對象(在glBegin/glEnd部分)
  4. 檢索原來的矩陣(如果你把它壓入堆棧使用glPopMatrix)

重複此過程,每一個繪製對象在你的場景中。

操作對象時,您可以爲每個對象定義一個矩陣,以便您可以獨立操作它們。然後你可以自己計算每個對象的矩陣(查看glm - 完成這樣的事情的整潔框架),然後代替第2步。使用glMultMatrix並設置自己的矩陣。另外,你正在使用傳統的openGL代碼,所以我猜你現在正在學習如何工作。我的建議不是學習舊東西:看看glsl着色器編程,vertexbufferobjects和所有超越opengl 1.4的好東西,那裏有一些非常好的東西http://www.opengl-tutorial.org/

+0

不幸的是,這個東西似乎不適用於過剩,儘管它給了我一些想法。我不得不使用過剩。 – cluemein 2015-02-23 23:08:21

+1

對不起,好像我誤解了這個問題。在對象空間中的變換應該是這樣的。如果在這裏選擇對象是問題,請搜索「對象拾取」。互聯網中有很多資源。但它最終會歸結爲像MorphingDragongon所評論的那樣的場景。 – hakononakani 2015-02-23 23:18:30

相關問題