八个立方体的坐标方向判定
缩放导致的法线问题
//更新模型位置
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效果
模型在局部空间和世界空间的旋转
(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;
}
}
}