Orbiting via 3D Transformations
This commit is contained in:
parent
4d952f035d
commit
532483c6f9
@ -7,6 +7,7 @@
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <array>
|
||||
#include <stack>
|
||||
|
||||
#define numVAOs 1
|
||||
#define numVBOs 2
|
||||
@ -16,11 +17,11 @@ GLuint vao[numVAOs];
|
||||
GLuint vbo[numVBOs];
|
||||
|
||||
glm::vec3 camera;
|
||||
glm::vec3 cubeLoc,pyramidLoc;
|
||||
GLuint mvLoc,projLoc;
|
||||
int width, height;
|
||||
float aspect;
|
||||
glm::mat4 mMat, pMat, vMat, mvMat;
|
||||
std::stack<glm::mat4>transforms;
|
||||
|
||||
void setupVertices(void) { // 36 vertices, 12 triangles, makes 2x2x2 cube placed at origin
|
||||
float cubePositions[108] = {
|
||||
@ -58,14 +59,27 @@ void setupVertices(void) { // 36 vertices, 12 triangles, makes 2x2x2 cube placed
|
||||
|
||||
void init(GLFWwindow* window) {
|
||||
renderingProgram=utils::createShaderProgram("vertShader.glsl","fragShader.glsl");
|
||||
camera={0.0f,0.0f,-8.0f};
|
||||
cubeLoc={0.0f,-2.0f,0.0f};
|
||||
pyramidLoc={4.0f,4.0f,-4.0f};
|
||||
camera={0.0f,0.0f,-12.0f};
|
||||
setupVertices();
|
||||
}
|
||||
|
||||
double lastTime=0;
|
||||
|
||||
void DrawCube(){
|
||||
glUniformMatrix4fv(mvLoc,1,GL_FALSE,glm::value_ptr(mMat));
|
||||
glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(pMat));
|
||||
glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
|
||||
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
|
||||
glDrawArrays(GL_TRIANGLES,0,36);
|
||||
}
|
||||
void DrawSquarePyramid(){
|
||||
glUniformMatrix4fv(mvLoc,1,GL_FALSE,glm::value_ptr(mMat));
|
||||
glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(pMat));
|
||||
glBindBuffer(GL_ARRAY_BUFFER,vbo[1]);
|
||||
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
|
||||
glDrawArrays(GL_TRIANGLES,0,18);
|
||||
}
|
||||
|
||||
void display(GLFWwindow* window, double currentTime) {
|
||||
double elapsedTime=currentTime-lastTime;
|
||||
lastTime=currentTime;
|
||||
@ -77,6 +91,7 @@ void display(GLFWwindow* window, double currentTime) {
|
||||
glUseProgram(renderingProgram);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
glEnableVertexAttribArray(0);
|
||||
|
||||
mvLoc=glGetUniformLocation(renderingProgram,"mv_matrix");
|
||||
projLoc=glGetUniformLocation(renderingProgram,"proj_matrix");
|
||||
@ -86,24 +101,37 @@ void display(GLFWwindow* window, double currentTime) {
|
||||
pMat=glm::perspective(utils::degToRad(60),aspect,0.1f,1000.f);
|
||||
|
||||
vMat=glm::translate(glm::mat4(1.0f),glm::vec3{camera.x,camera.y,camera.z});
|
||||
mMat=glm::translate(glm::mat4(1.0f),cubeLoc);
|
||||
mvMat=vMat*mMat;
|
||||
transforms.push(vMat);
|
||||
|
||||
glUniformMatrix4fv(mvLoc,1,GL_FALSE,glm::value_ptr(mvMat));
|
||||
glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(pMat));
|
||||
mMat=glm::translate(transforms.top(),{0.f,0.f,0.f});
|
||||
transforms.push(mMat);
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(90)*currentTime),{0.f,1.f,0.f});
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(12)),{0.f,0.f,1.f});
|
||||
DrawSquarePyramid();
|
||||
mMat=glm::translate(transforms.top(),{0.f,0.f,0.f});
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(90)*currentTime),{0.f,1.f,0.f});
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(192)),{0.f,0.f,1.f});
|
||||
mMat=glm::translate(mMat,{0.f,2.f,0.f});
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(270)),{0.f,1.f,0.f});
|
||||
DrawSquarePyramid();
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
|
||||
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
|
||||
glEnableVertexAttribArray(0);
|
||||
glDrawArrays(GL_TRIANGLES,0,36);
|
||||
mMat=glm::translate(transforms.top(),{sin(currentTime*0.5)*6,sin(currentTime*0.5)*0.8-1,cos(currentTime*0.5)*6});
|
||||
transforms.push(mMat);
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(24)-28),{0,0,1});
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(24)*currentTime+28),{0,1,0});
|
||||
DrawCube();
|
||||
|
||||
mMat=glm::translate(glm::mat4(1.0f),pyramidLoc);
|
||||
mvMat=vMat*mMat;
|
||||
glUniformMatrix4fv(mvLoc,1,GL_FALSE,glm::value_ptr(mvMat));
|
||||
glUniformMatrix4fv(projLoc,1,GL_FALSE,glm::value_ptr(pMat));
|
||||
glBindBuffer(GL_ARRAY_BUFFER,vbo[1]);
|
||||
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
|
||||
glDrawArrays(GL_TRIANGLES,0,18);
|
||||
mMat=glm::rotate(transforms.top(),utils::degToRad(90),{1,0,0});
|
||||
mMat=glm::translate(mMat,{sin(currentTime*3)*3,0,cos(currentTime*3)*3});
|
||||
mMat=glm::scale(mMat,{0.3,0.3,0.3});
|
||||
mMat=glm::rotate(mMat,float(-utils::degToRad(220)*currentTime+4),{0,1,0});
|
||||
DrawCube();
|
||||
|
||||
mMat=glm::rotate(transforms.top(),utils::degToRad(90),{1,1,0});
|
||||
mMat=glm::translate(mMat,{sin(currentTime*3)*3,0,cos(currentTime*3)*3});
|
||||
mMat=glm::scale(mMat,{0.3,0.3,0.3});
|
||||
mMat=glm::rotate(mMat,float(utils::degToRad(120)*currentTime),{0,1,0});
|
||||
DrawCube();
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user