static void zprMotion(int x, int y) { bool changed = false; const int dx = x - _mouseX; const int dy = y - _mouseY; if (dx==0 && dy==0) return; if (_mouseRight) { objectPositionZ += dy * 0.01f; changed = true; } else if (_mouseLeft) { objectRotationHeading += dx * 0.3f; objectRotationPitch += dy * 0.3f; changed = true; } if (changed) { updateObjectMatrix(); } if (_mouseMiddle) { float speed = 0.05f; cameraPositionX += _cameraMatrix[0] * speed * -dx; cameraPositionY += _cameraMatrix[4] * speed * -dx; cameraPositionZ += _cameraMatrix[8] * speed * -dx; cameraPositionX += _cameraMatrix[1] * speed * dy; cameraPositionY += _cameraMatrix[5] * speed * dy; cameraPositionZ += _cameraMatrix[9] * speed * dy; } else if (_mouseRight) { float speed = 0.05f; cameraPositionX += _cameraMatrix[2] * speed * -dy; cameraPositionY += _cameraMatrix[6] * speed * -dy; cameraPositionZ += _cameraMatrix[10] * speed * -dy; } else if (_mouseLeft) { cameraRotationHeading += dx * 0.3f; cameraRotationPitch += dy * 0.3f; } updateCameraMatrix(); _mouseX = x; _mouseY = y; }
glm::mat4 Camera::getOrientationMatrix(){ if( eyeChanged ){ updateCameraMatrix(); } glm::mat4 orientationMat(view); orientationMat[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); return orientationMat; }
glm::mat4 Camera::getCameraMatrix(){ if( projectionChanged ){ updateProjectionMatrix(); } if( eyeChanged ){ updateCameraMatrix(); } return camera; }
void zprInit() { updateObjectMatrix(); updateCameraMatrix(); glutReshapeFunc(zprReshape); glutMouseFunc(zprMouse); glutMotionFunc(zprMotion); glutKeyboardFunc(zprKey); }
void zprInit(mat4 *viewMatrix, vec3 cam, vec3 point) { // shader = s; // EN shader?! Orimligt! // viewMatName = vMatName; // projMatName = pMatName; _cameraMatrix = viewMatrix; // _projectionMatrix = projMatrix; // ??? camera = cam; lookAtPoint = point; up = SetVector(0, 1, 0); updateCameraMatrix(NULL); glutMouseFunc(zprMouse); glutKeyboardFunc(zprKey); glutMotionFunc(zprMouseFunc); }
static void zprKey(unsigned char key, int x, int y) { float speed = 10.f; float speedX = 0.f; float speedY = 0.f; float speedZ = 0.f; switch (key) { case 'w': speedZ = 1.f; break; case 's': speedZ = -1.f; break; case 'q': speedY = -1.f; break; case 'e': speedY = 1.f; break; case 'd': speedX = -1.f; break; case 'a': speedX = 1.f; break; } cameraPositionX += _cameraMatrix[0] * speed * speedX; cameraPositionY += _cameraMatrix[4] * speed * speedX; cameraPositionZ += _cameraMatrix[8] * speed * speedX; cameraPositionX += _cameraMatrix[1] * speed * speedY; cameraPositionY += _cameraMatrix[5] * speed * speedY; cameraPositionZ += _cameraMatrix[9] * speed * speedY; cameraPositionX += _cameraMatrix[2] * speed * speedZ; cameraPositionY += _cameraMatrix[6] * speed * speedZ; cameraPositionZ += _cameraMatrix[10] * speed * speedZ; updateCameraMatrix(); }
void zprMouseFunc(int x, int y) { if(_mouseLeft) { angle_y = (float)(x - lastX) *0.002; angle_x = (float)(y - lastY) *0.002; // tmpMat1 = ArbRotate(right, angle_x); tmpMat1 = ArbRotate(right, -angle_x); // Reversed, also looks more reasonable (but wasn't interesting before the Mac version got isFlipped.) tmpMat2 = ArbRotate(up, -angle_y); // Reversed; I think this feels better /Ingemar 130901 rotMat = Mult(tmpMat2, tmpMat1); updateCameraMatrix(&rotMat); lastX = x; lastY = y; } printf("%d %d\n", x, y); printf("diff: x: %3.5f y: %3.5f\n", angle_y, angle_x); }
void zprMouseFunc(int x, int y) { // printf("MouseFunc\n"); if(_mouseLeft) { angle_y = (float)(x - lastX) *0.002; angle_x = (float)(y - lastY) *0.002; // tmpMat1 = ArbRotate(right, angle_x); tmpMat1 = ArbRotate(right, -angle_x); // Reverse this too - only Linux??? tmpMat2 = ArbRotate(up, -angle_y); // Reversed; I think this feels better /Ingemar 130901 rotMat = Mult(tmpMat2, tmpMat1); updateCameraMatrix(&rotMat); lastX = x; lastY = y; } // printf("%d %d\n", x, y); // printf("diff: x: %3.5f y: %3.5f\n", angle_y, angle_x); }
static void zprKey(unsigned char key, int x, int y) { float speed = 0.3, rotSpeed = 0.3; GLfloat speedX = 0, speedY = 0, speedZ = 0, angle = 0.0, dX = 0, dY = 0, dZ = 0; bool turnedX = false, turnedY = false; // printf("%c\n", key); switch (key) { case 'i': speedY = speed; break; case 'k': speedY = -speed; break; case 'j': speedX = -speed; break; case 'l': speedX = speed; break; case 'd': angle = -rotSpeed; turnedY = true; break; case 'a': angle = rotSpeed; turnedY = true; break; case 'w': speedZ = -speed; break; case 's': speedZ = speed; break; case 'q': angle = -rotSpeed; turnedX = true; break; case 'e': angle = rotSpeed; turnedX = true; break; } dX = (GLfloat) _cameraMatrix->m[0] * speedX + _cameraMatrix->m[4] * speedY + _cameraMatrix->m[8] * speedZ; dY = (GLfloat) _cameraMatrix->m[1] * speedX + _cameraMatrix->m[5] * speedY + _cameraMatrix->m[9] * speedZ; dZ = (GLfloat) _cameraMatrix->m[2] * speedX + _cameraMatrix->m[6] * speedY + _cameraMatrix->m[10] * speedZ; camera.x += dX; camera.y += dY; camera.z += dZ; lookAtPoint.x += dX; lookAtPoint.y += dY; lookAtPoint.z += dZ; if(turnedY) { tMat = T(-camera.x, -camera.y, -camera.z); rotMat = ArbRotate(up, angle); lookAtPoint = MultVec3(tMat, lookAtPoint); lookAtPoint = MultVec3(rotMat, lookAtPoint); tMat = T(camera.x, camera.y, camera.z); lookAtPoint = MultVec3(tMat, lookAtPoint); } if(turnedX) { tMat = T(-lookAtPoint.x, -lookAtPoint.y, -lookAtPoint.z); rotMat = ArbRotate(right, angle); camera = MultVec3(tMat, camera); camera = MultVec3(rotMat, camera); tMat = T(lookAtPoint.x, lookAtPoint.y, lookAtPoint.z); camera = MultVec3(tMat, camera); } updateCameraMatrix(0); }
glm::mat4 Camera::getView(){ if( eyeChanged ){ updateCameraMatrix(); } return view; }