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