void SimpleCamera::update() { int forwardAxis(-1); switch (m_data->m_cameraUpAxis) { case 1: forwardAxis = 2; m_data->m_cameraUp = b3MakeVector3(0,1,0); //gLightPos = b3MakeVector3(-50.f,100,30); break; case 2: forwardAxis = 1; m_data->m_cameraUp = b3MakeVector3(0,0,1); //gLightPos = b3MakeVector3(-50.f,30,100); break; default: { b3Assert(0); return; } }; b3Vector3 eyePos = b3MakeVector3(0,0,0); eyePos[forwardAxis] = -m_data->m_cameraDistance; m_data->m_cameraForward = b3MakeVector3(eyePos[0],eyePos[1],eyePos[2]); if (m_data->m_cameraForward.length2() < B3_EPSILON) { m_data->m_cameraForward.setValue(1.f,0.f,0.f); } else { m_data->m_cameraForward.normalize(); } // m_azi=m_azi+0.01; b3Scalar rele = m_data->m_yaw * b3Scalar(0.01745329251994329547);// rads per deg b3Scalar razi = m_data->m_pitch * b3Scalar(0.01745329251994329547);// rads per deg b3Quaternion rot(m_data->m_cameraUp,razi); b3Vector3 right = m_data->m_cameraUp.cross(m_data->m_cameraForward); b3Quaternion roll(right,-rele); eyePos = b3Matrix3x3(rot) * b3Matrix3x3(roll) * eyePos; m_data->m_cameraPosition = eyePos; m_data->m_cameraPosition+= m_data->m_cameraTargetPosition; }
void GLInstancingRenderer::updateCamera() { GLint err = glGetError(); b3Assert(err==GL_NO_ERROR); int m_forwardAxis(2); float m_frustumZNear=1; float m_frustumZFar=10000.f; // m_azi=m_azi+0.01; b3Scalar rele = m_data->m_ele * b3Scalar(0.01745329251994329547);// rads per deg b3Scalar razi = m_data->m_azi * b3Scalar(0.01745329251994329547);// rads per deg b3Quaternion rot(m_data->m_cameraUp,razi); b3Vector3 eyePos = b3MakeVector3(0,0,0); eyePos[m_forwardAxis] = -m_data->m_cameraDistance; b3Vector3 forward = b3MakeVector3(eyePos[0],eyePos[1],eyePos[2]); if (forward.length2() < B3_EPSILON) { forward.setValue(1.f,0.f,0.f); } b3Vector3 right = m_data->m_cameraUp.cross(forward); b3Quaternion roll(right,-rele); eyePos = b3Matrix3x3(rot) * b3Matrix3x3(roll) * eyePos; m_data->m_cameraPosition[0] = eyePos.x; m_data->m_cameraPosition[1] = eyePos.y; m_data->m_cameraPosition[2] = eyePos.z; m_data->m_cameraPosition += m_data->m_cameraTargetPosition; if (m_screenWidth == 0 && m_screenHeight == 0) return; b3Scalar aspect; b3Vector3 extents; aspect = m_screenWidth / (b3Scalar)m_screenHeight; extents.setValue(aspect * 1.0f, 1.0f,0); if (m_screenWidth > m_screenHeight) { b3CreateFrustum(-aspect * m_frustumZNear, aspect * m_frustumZNear, -m_frustumZNear, m_frustumZNear, m_frustumZNear, m_frustumZFar,projectionMatrix); } else { b3CreateFrustum(-aspect * m_frustumZNear, aspect * m_frustumZNear, -m_frustumZNear, m_frustumZNear, m_frustumZNear, m_frustumZFar,projectionMatrix); } b3CreateLookAt(m_data->m_cameraPosition,m_data->m_cameraTargetPosition,m_data->m_cameraUp,modelviewMatrix); }