void GameObject::Update(float deltaTime) {
	this->m_vForward = CalcForwardVector(this->Pitch(), this->Yaw());
	this-> m_vRight = CalcRightVector(this->Pitch(), this->Yaw());
	this->m_vUp = CalcUpVector(this->Pitch(), this->Yaw());

	this->m_vCameraForward = CalcForwardVector(this->CameraPitch(), this->CameraYaw());
	this->m_vCameraRight = CalcRightVector(this->CameraPitch(), this->CameraYaw());
	this->m_vCameraUp = CalcUpVector(this->CameraPitch(), this->CameraYaw());

	CalcVelocity();
}
Exemple #2
0
/*!
*/
void	CalcLispMatrix(SLispStatus* pStatus, CVec3List* pList)
{
	D3DXVECTOR3		min, max;
	D3DXVECTOR3		up;
	D3DXMATRIX		matLisp;
	CVec3List		ListCopy = *pList;
	float			cosGamma = D3DXVec3Dot(&(pStatus->vViewDir), &(pStatus->vLightDir));
	float			sinGamma = sqrtf(1.0f - cosGamma * cosGamma);

	// アップベクトルを求める
	CalcUpVector(&up, &(pStatus->vViewDir), &(pStatus->vLightDir));

	// カメラ視点、ライトベクトル、アップベクトルからビュー行列を求める
	D3DXMatrixLookAtLH(&(pStatus->matView), &(pStatus->vEyePos), &(pStatus->vEyePos + pStatus->vLightDir), &up);
//	pStatus->tmpmatView = pStatus->matView;

	// ポイントリストを変換する
	ListCopy.Transform(&(pStatus->matView));

	// 変換したポイントリストを内包するAABBを取得する
	ListCopy.GetAABB(&max, &min);

	// ライトスペースに垂直なビューのニアクリップ面とファークリップ面を求める
	// AABB はライトのビュー行列で変換されているので y が上記ビューの奥行きになる
#if		0
	float			factor = 1.0f / sinGamma;
	float			z_n = factor * pStatus->fNearDist;
	float			d = max.y - min.y;
	float			z_f = z_n + d * sinGamma;
	float			n = (z_n + sqrtf(z_f * z_n)) * factor;
	float			f = n + d;
	D3DXVECTOR3		pos;

	// 新しい視点を求める
	pos = pStatus->vEyePos - (up * (n - pStatus->fNearDist));

	pStatus->newpos = pos;


	// 新しいライトビュー行列を求める
	D3DXMatrixLookAtLH(&(pStatus->matView), &pos, &(pos + pStatus->vLightDir), &up);

	// ニアクリップ面とファークリップ面からY方向への透視変換行列を求める
	D3DXMatrixIdentity(&matLisp);
	matLisp._22 = f / (f - n);
	matLisp._42 = -f * n / (f - n);
	matLisp._24 = 1.0f;
	matLisp._44 = 0.0f;

	// 現在のライト視点からの変換行列を求める
	D3DXMATRIX	matLVP;
	D3DXMatrixMultiply(&matLVP, &(pStatus->matView), &matLisp);

	// この行列で元のポイントリストを変換する
	ListCopy = *pList;
	ListCopy.Transform(&matLVP);
#else
	float	d = max.y - min.y;
	float	n = (min.y > 0.0f) ? (min.y + d * 0.1f) : (d * 0.25f);
	float	f = n + d;
	float	p = min.y - n;

	// ニアクリップ面とファークリップ面からY方向への透視変換行列を求める
	D3DXMatrixIdentity(&matLisp);
	matLisp._22 = f / (f - n);
	matLisp._42 = -f * n / (f - n);
	matLisp._24 = 1.0f;
	matLisp._44 = 0.0f;

	// 現在のライト視点からの変換行列を求める
	D3DXMATRIX	matLVP;
	D3DXMatrixTranslation(&matLVP, 0.0f, -p, 0.0f);
	D3DXMatrixMultiply(&(pStatus->matView), &(pStatus->matView), &matLVP);
	D3DXMatrixMultiply(&matLVP, &matLVP, &matLisp);

	// この行列でポイントリストを変換する
	ListCopy.Transform(&matLVP);


	D3DXVECTOR3 camview( 0.0f, 0.0f, 0.0f );
	D3DXMATRIX invview;
	D3DXMatrixInverse( &invview, NULL, &(pStatus->matView) );
	D3DXVec3TransformCoord( &(pStatus->newpos), &camview, &invview );


//	D3DXVECTOR3 camview0( 0.0f, 0.0f, 0.0f );
//	D3DXVECTOR3 camview1( 0.0f, 0.0f, 1.0f );
//	
//	D3DXMATRIX invview;
//	D3DXMatrixInverse( &invview, NULL, &(pStatus->matView) );
//
//	D3DXVECTOR3 camp0, camp1;
//	D3DXVec3TransformCoord( &camp0, &camview0, &invview );
//	D3DXVec3TransformCoord( &camp1, &camview1, &invview );
//
//	D3DXVECTOR3 vec10;
//	vec10 = camp0 - camp1;
//	D3DXVec3Normalize( &vec10, &vec10 );
//
//	pStatus->newpos = camp0 + pStatus->fNearDist * vec10;


#endif
	// AABBを取得する
	ListCopy.GetAABB(&max, &min);

	// 上記のAABBが (-1, -1, 0) 〜 (1, 1, 1) の範囲になるような行列を作成する
	// 位置とサイズを正確なものにするため
	ScaleMatrixToFit(&(pStatus->matProj), &max, &min);

	// 最終的な透視変換行列を求める
	D3DXMatrixMultiply(&(pStatus->matProj), &matLisp, &(pStatus->matProj));
}