Camera::Camera( ) : mPos( 0.0f, 0.0f, 0.0f ), mRight( 1.0f, 0.0f, 0.0f ), mUp( 0.0f, 1.0f, 0.0f ), mLook( 0.0f, 0.0f, 1.0f ) { SetProj( 0.25f*MathHelper::Pi, 1.0f, 1.0f, 1000.0f ); }
Camera::Camera(IDirect3DDevice9 *d3dDevice, int w, int h) :d3dDevice(d3dDevice), width(w), height(h) { vec[rig] = D3DXVECTOR3(1.0f, 0.0f, 0.0f); vec[up] = D3DXVECTOR3(0.0f, 1.0f, 0.0f); vec[fore] = D3DXVECTOR3(0.0f, 0.0f, 1.0f); projmat = new D3DXMATRIX; viewmat = new D3DXMATRIX; SetProj(); SetViewport(); }
TrackballCamera::TrackballCamera(float w, float h) { SetWindow(w, h); vec3 mCenter = vec3(0.0f); float mRadius = 1.0f; quat mQuat = quat(); vec3 pos = vec3(0.0f, 0.0f, 4.0f); vec3 target = vec3(0.0f); setMmworldQuat(); //mmWorld = scale(mat4(1.0f), vec3(0.5f)); SetView(pos, target); SetProj(45.0f, (float)windowWidth / windowHeight, 0.1f, 100.f); mbMouseLButtonDown = false; mbMouseWheelRoll = false; mbMouseRButtonDown = false; }
// アスペクト比を設定 const D3DXMATRIX* CProj::SetAspect( float aspect ) { return SetProj( m_Fovy, aspect, m_Near, m_Far ); }
// 画角設定 const D3DXMATRIX* CProj::SetFovy( float fovy ) { return SetProj( fovy, m_Aspect, m_Near, m_Far ); }
// ファークリップ設定 const D3DXMATRIX* CProj::SetFar( float zf ) { return SetProj( m_Fovy, m_Aspect, m_Near, zf ); }
// ニアクリップ設定 const D3DXMATRIX* CProj::SetNear( float zn ) { return SetProj( m_Fovy, m_Aspect, zn, m_Far ); }
// コンストラクタ CProj::CProj( float fovy, float aspect, float zn, float zf ) { SetProj( fovy, aspect, zn, zf ); }
void proCompCamera::OnUpdate(const tTimeInfo &timeInfo) { if(m_bDirtyModifier) { m_renderMask = proRenderBuffer::GetRenderMaskFromString(USE_MOD(renderPass)); if(USE_MOD(fov) != 0.0f) { SetProj(USE_MOD(fov), USE_MOD(aspect), USE_MOD(nearPlane), USE_MOD(farPlane)); } else { SetProj2D(USE_MOD(width), USE_MOD(height), USE_MOD(nearPlane), USE_MOD(farPlane)); } SetView(Vec3f(0.0f, 0.0f, 0.0f), Vec3f(0.0f, 1.0f, 0.0f), Vec3f(0.0f, 0.0f, 1.0f)); proRenderBuffer::Instance()->SetRenderCamera(m_renderMask, GetOwner()); m_viewMat.pos = USE_MOD(pos); SET_CACHE_COMP(proCompMat); if(GET_CACHE_COMP(proCompMat)) { proMat4f &mat = GET_CACHE_COMP(proCompMat)->GetMatrix(); mat.pos = USE_MOD(pos); } m_bDirtyModifier = FALSE; } UpdateViewMatrix(); proRenderBuffer::Instance()->SetViewMatrixMask(m_renderMask, m_viewMat); proRenderBuffer::Instance()->SetProjMatrixMask(m_renderMask, m_projMat); proRenderBuffer::Instance()->SetModelMatrixMask(m_renderMask, Mat4fI()); // create a view frustum SET_CACHE_COMP(proCompMat) if(GET_CACHE_COMP(proCompMat)) { proMat4f mat = GET_CACHE_COMP(proCompMat)->GetMatrix(); proRenderBuffer::Instance()->SetCameraMatrixMask(m_renderMask, mat); peFloat halfFOV = USE_MOD(fov) * 0.5f; peFloat tanFOV = tan(halfFOV); peFloat drawSize = 1.0f; proVec4f ntr = mat * Vec4f(tanFOV * USE_MOD(nearPlane) * USE_MOD(aspect), USE_MOD(nearPlane), tanFOV * USE_MOD(nearPlane), 1.0f); proVec4f ntl = mat * Vec4f(-1 * tanFOV * USE_MOD(nearPlane) * USE_MOD(aspect), USE_MOD(nearPlane), tanFOV * USE_MOD(nearPlane), 1.0f); proVec4f nbl = mat * Vec4f(-1 * tanFOV * USE_MOD(nearPlane) * USE_MOD(aspect), USE_MOD(nearPlane), -1 * tanFOV * USE_MOD(nearPlane), 1.0f); proVec4f nbr = mat * Vec4f(tanFOV * USE_MOD(nearPlane) * USE_MOD(aspect), USE_MOD(nearPlane), -1 * tanFOV * USE_MOD(nearPlane), 1.0f); proVec4f ftr = mat * Vec4f(tanFOV * USE_MOD(farPlane) * USE_MOD(aspect), USE_MOD(farPlane), tanFOV * USE_MOD(farPlane), 1.0f); proVec4f ftl = mat * Vec4f(-1 * tanFOV * USE_MOD(farPlane) * USE_MOD(aspect), USE_MOD(farPlane), tanFOV * USE_MOD(farPlane), 1.0f); proVec4f fbl = mat * Vec4f(-1 * tanFOV * USE_MOD(farPlane) * USE_MOD(aspect), USE_MOD(farPlane), -1 * tanFOV * USE_MOD(farPlane), 1.0f); proVec4f fbr = mat * Vec4f(tanFOV * USE_MOD(farPlane) * USE_MOD(aspect), USE_MOD(farPlane), -1 * tanFOV * USE_MOD(farPlane), 1.0f); proVec3f nearNormal = Vec3f(Cross(ntr-ntl, nbl-ntl)).Normalize(); proVec3f farNormal = Vec3f(Cross(fbl-ftl, ftr-ftl)).Normalize(); proVec3f leftNormal = Vec3f(Cross(nbl-ntl, ftl-ntl)).Normalize(); proVec3f rightNormal = Vec3f(Cross(fbr-ftr, ntr-ftr)).Normalize(); proVec3f bottomNormal = Vec3f(Cross(nbr-nbl, fbl-nbl)).Normalize(); proVec3f topNormal = Vec3f(Cross(ftl-ntl, ntr-ntl)).Normalize(); proPlane planeNear; proPlane planeFar; proPlane planeLeft; proPlane planeRight; proPlane planeBottom; proPlane planeTop; planeNear.m_normal = nearNormal; planeNear.m_pos = Vec3f(ntr); planeFar.m_normal = farNormal; planeFar.m_pos = Vec3f(ftr); planeLeft.m_normal = leftNormal; planeLeft.m_pos = Vec3f(ntl); planeRight.m_normal = rightNormal; planeRight.m_pos = Vec3f(ntr); planeBottom.m_normal = bottomNormal; planeBottom.m_pos = Vec3f(nbl); planeTop.m_normal = topNormal; planeTop.m_pos = Vec3f(ntl); proRenderBuffer::Instance()->SetCameraPlaneMask(m_renderMask, planeNear, planeFar, planeLeft, planeRight, planeBottom, planeTop); } }