您的位置:首页 > 产品设计 > UI/UE

UE4学习5 第三人称使用自己的摄像机旋转方法(不用controller)

2017-03-15 16:22 681 查看
判断是否单点触摸先

在自己写的PlayerController中的

InputTouch(uint32 Handle, ETouchType::Type Type, const FVector2D& TouchLocation, FDateTime DeviceTimestamp, uint32 TouchpadIndex)

FVector Location, Direction;
this->DeprojectScreenPositionToWorld(TouchLocation.X, TouchLocation.Y, L, DLocation, Direction);

MyRotate(Location, Direction, FingerDelta);//执行这个旋转 那个FingerDelta是点击移动距离

void AMyCharacter::MyRotate(const FVector & location, const FVector & Direction, FVector2D& Delta)//实现这个旋转

{
Delta *= 0.01f;
if (fabs(Delta.X) > fabs(Delta.Y))//X大就横着转
{
FQuat rot(FVector(0.f, 0.f, 1.0f), Delta.X*0.5f);//构造一个代表绕着Z轴转一个弧度为Delta.X*0.5的四元数
CameraBoom->AddRelativeRotation(rot);//将旋转加给摄像机
}
else //竖着旋转
{

FVector ForwardVector = CameraBoom->GetForwardVector();//获得面朝方向
FVector DownVector(0.f, 0.f, -1.0f);//向下的单位向量
float dotf = FVector::DotProduct(ForwardVector, FVector(0.f, 0.f, -1.0f));//点乘这俩向量,得到弧度
Delta.Y = FMath::Clamp(Delta.Y, -PI / 18.f, PI / 18.f);//限制一下大小
FQuat rot(CameraBoom->GetRightVector(), Delta.Y);//构造一个代表绕着摄像机的Y轴,转一个弧度为弧度为Delta.Y的四元数

static float lastY = 0.f;//因为是TouchMove进来的,所以要叠加。
//if(dotf < 0.998&& dotf > sin((PI / 18.0f)))
       //旋转肯定是正负180度之间嘛正负1的弧度
if (dotf < 0.998&& dotf>-0.998&& FVector::DotProduct(FVector::CrossProduct(ForwardVector, DownVector), CameraBoom->GetRightVector()) > 0.f)//叉乘得到了垂直于面朝方向和侧面方向的一个向量,代表Z方向
{ 最长这个参数,我理解的是这个Z与地面的夹角必须大于0 不然整个地面就倒过来了
CameraBoom->AddWorldRotation(rot);
lastY = Delta.Y;//这里就是叠加的地方了。
}
else
{

if (lastY*Delta.Y < 0.f)//小于0就是往下滑鼠标
{
CameraBoom->AddWorldRotation(rot);
}
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ UE4
相关文章推荐