void TurntableCamera<real>::Update() { Transformation<real> transformation; Vector3<real> initRotationAxis = Vector3<real>( 0, 1, 0 ) ^ mThetaAxis; if ( initRotationAxis.SquaredLength() > 1e-5 ) transformation.SetRotationAxis( initRotationAxis.Normalized(), asin( initRotationAxis.Length() ) ); transformation.RotateAxis( mPhiAxis, mPhi ); transformation.RotateAxis( mThetaAxis, mTheta ); Transformation<real> transformationT; transformationT.RotateAxis( mPhiAxis, mPhi ); transformationT.RotateAxis( mThetaAxis, mTheta ); transformation.SetTranslation( transformationT.GetRotation() * ( mPhiAxis ^ mThetaAxis ).Normalized() * mDistance + mCenter ); this->SetLocalTransformation( transformation ); Camera<real>::Update(); }
Quat GetRot() const{ return mTransformation.GetRotation(); }
//---------------------------------------------------------------------------- void Update() { if (mOverridingCamera){ mOverridingCamera->Update(); } // world coordinates (Blender style) // x: right // y: forward // z: up bool viewChanged = mViewPropertyChanged; if (mViewPropertyChanged) { mViewPropertyChanged = false; Vec3 right = mTransformation.GetMatrix().Column(0); Vec3 forward = mTransformation.GetMatrix().Column(1); Vec3 up = mTransformation.GetMatrix().Column(2); const Vec3& pos = mTransformation.GetTranslation(); mMatrices[View] = fb::MakeViewMatrix(pos, right, forward, up); mTransformation.GetHomogeneous(mMatrices[InverseView]); mFrustum.mOrigin = mTransformation.GetTranslation(); mFrustum.mOrientation = mTransformation.GetRotation(); } bool projChanged = mProjPropertyChanged; if (mProjPropertyChanged) { mAspectRatio = GetWidth() / (Real)GetHeight(); mProjPropertyChanged = false; if (!mOrthogonal) { mMatrices[ProjBeforeSwap] = mMatrices[Proj] = MakeProjectionMatrix(mFov, mAspectRatio, mNear, mFar); } else { mMatrices[ProjBeforeSwap] = mMatrices[Proj] = MakeOrthogonalMatrix((Real)mOrthogonalData.left, (Real)mOrthogonalData.top, (Real)mOrthogonalData.right, (Real)mOrthogonalData.bottom, mNear, mFar); } if (mYZSwap) { Mat44 swapMat( 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1); mMatrices[Proj] = mMatrices[Proj] * swapMat; } mMatrices[InverseProj] = mMatrices[Proj].Inverse(); mFrustum.SetData(mNear, mFar, mFov, mAspectRatio); } if (projChanged || viewChanged) { mMatrices[ViewProj] = mMatrices[Proj] * mMatrices[View]; mMatrices[InverseViewProj] = mMatrices[ViewProj].Inverse(); UpdateFrustum(); if (viewChanged && !mSelf->mObservers_.empty()){ auto& observers = mSelf->mObservers_[TransformChanged]; for (auto it = observers.begin(); it != observers.end(); /**/){ auto observer = it->lock(); if (!observer){ it = observers.erase(it); continue; } ++it; observer->OnViewMatrixChanged(); } } if (projChanged && !mSelf->mObservers_.empty()){ auto& observers = mSelf->mObservers_[TransformChanged]; for (auto it = observers.begin(); it != observers.end(); /**/){ auto observer = it->lock(); if (!observer){ it = observers.erase(it); continue; } ++it; observer->OnProjMatrixChanged(); } } mRayCache.clear(); } }
const Quat& GetRotation() const{ if (mOverridingCamera){ return mOverridingCamera->GetRotation(); } return mTransformation.GetRotation(); }
void MeshObject::UpdateModelViewTransformation(Transformation const & model_view) { // TODO: _scale and _local_transformation constitutes way too much transformation data Transformation transformation(model_view.GetTranslation(), model_view.GetRotation(), _scale); SetModelViewTransformation(transformation); }