DX游戏引擎优化笔记

八个立方体的坐标方向判定

缩放导致的法线问题

//更新模型位置
XMMATRIX ATRIXWorld = XMLoadFloat4x4(&InRenderingData->WorldMatrix);
XMMATRIX ATRIXTextureTransform = XMLoadFloat4x4(&InRenderingData->TextureTransform);

//法线矩阵
XMVECTOR AATRIXWorldDeterminant = XMMatrixDeterminant(ATRIXWorld);
XMMATRIX NormalInverseMatrix = XMMatrixInverse(&AATRIXWorldDeterminant, ATRIXWorld);

随着摄像机远近保持操作轴在屏幕上的大小:

if (GetWorld())
{
	if (GetWorld()->GetCamera())
	{
		fvector_3d New3Value = EngineMath::ToVector3d(GetWorld()->GetCamera()->GetPosition()) - EngineMath::ToVector3d(GetPosition());
		fvector_3d Scale = New3Value.len() * 1 / FixedZoom;

		SetScale(Scale);
	}
}

选择CD算法:

atan2:计算范围 -180~180

atan:计算范围 -90~90

根据UV的x和y通过atan2求出角度

floor(角度+=控制的值) 得到CD效果

模型在局部空间和世界空间的旋转

_{Rw}\cdot M^{-1}=R(R是局部空间的旋转,Rw是世界空间的旋转 )

看向目标和移动到观察者范围原理

template<class t>
static t lerp(const t& ina, const t& inb, float intime)
{
	return ina + (inb - ina) * intime;
}

旋转角度问题

八个象限的反转问题

if (SelectedObject)
{
	if (bOperationHandleSelect)
	{
		fvector_3d ActorWorldPosition;
		fvector_3d ActorWorldDir;
		float T2 = GetMouseCreenMovePosition(X, Y, ActorWorldPosition, ActorWorldDir);
		if (T2 != -1)
		{
			ActorWorldDir = GOperationHandleBase::GetSelectedObjectDirection(fvector_3d(), fvector_3d(), fvector_3d());
			
			float CameraAndSelectedDistance =
				(EngineMath::ToVector3d(GetWorld()->GetCamera()->GetPosition()) -
					EngineMath::ToVector3d(SelectedObject->GetPosition())).len();

			//摄像机和物体的相对 拖拽相对偏移保持不变
			float DelteRatio = (T2 - LastT2Value) / CameraAndSelectedDistance;

			//每帧的偏移
			float InValueOffset = DelteRatio - RotatorRatio;
			fvector_3d DeltaVector;
			//模型旋转
			{
				//矫正到正确的符号
				float Symbol = GetSymbolByCubeIndex(InValueOffset);

				DeltaVector = ActorWorldDir * Symbol * fabsf(InValueOffset) * 360.f;
			}

			//材质面片旋转
			{
				float SymbolMaterial = GetSymbolMaterialByCubeIndex(InValueOffset);
			
				SetCDValue(DelteRatio * SymbolMaterial);
			}
			
			frotator LastRotation;
			frotator DeltaRotation(DeltaVector.y, DeltaVector.z, DeltaVector.x);

			fquat ActorRotQuat;
			fquat DeltaRotQuat;
			ActorRotQuat.object_to_inertia(LastRotation);
			DeltaRotQuat.object_to_inertia(DeltaRotation);

			fquat ResultQuat;
			if (false)
			{

			}
			else
			{
				ResultQuat = DeltaRotQuat * ActorRotQuat;
			}

			frotator Rot;
			Rot.inertia_to_object(ResultQuat);

			//当作世界
			fvector_3d RotVector(Rot.roll, Rot.pitch, Rot.yaw);

			//
			if (true)
			{
				//按世界方向
				XMMATRIX WorldInverseMatrix;
				EngineMath::BuildInverseMatrix(
					WorldInverseMatrix,
					SelectedObject->GetPosition(),
					SelectedObject->GetScale(),
					SelectedObject->GetRightVector(),
					SelectedObject->GetUPVector(),
					SelectedObject->GetForwardVector());

				XMFLOAT3 XMSelectRot = EngineMath::ToFloat3(RotVector);
				FXMVECTOR SelectRot = XMLoadFloat3(&XMSelectRot);

				XMVECTOR OutSelectRot = XMVector3TransformNormal(SelectRot, WorldInverseMatrix);

				XMFLOAT3 SelectViewRot;
				XMStoreFloat3(&SelectViewRot, OutSelectRot);

				RotVector = EngineMath::ToVector3d(SelectViewRot);
			}

			SelectedObject->SetRotation(RotVector);

			RotatorRatio = DelteRatio;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值