UE4学习5 第三人称使用自己的摄像机旋转方法(不用controller)
2017-03-15 16:22
711 查看
判断是否单点触摸先
在自己写的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);
}
}
}
}
在自己写的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);
}
}
}
}
相关文章推荐
- Spring4.0MVC学习资料,Controller中的方法详解和使用(四)
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- Spring4.0MVC学习资料,Controller中的方法详解和使用(四)
- XenServer没有自己的文件系统,也就没有自己的ISO Libery,给我们创建虚拟机带来了不少困扰,使用正文这个方法可以不用先安装FileServer
- 数据库查询的基本方法,有很多不全的地方,自己学习使用
- Spring4.0MVC学习资料,Controller中的方法详解和使用(四)
- 【Unity 3D游戏开发学习笔记】总结摄像机和光源的使用方法
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- Java Web应用中使用ANT在线编译不用重起tomcat的方法
- AJAX学习基础:简单介绍数据岛使用方法
- 自己手动创建dataset的方法(不用从数据库倒入)
- 转:一个学习案例: 使用 IBM Rational Unified Process 作为方法框架
- Java Web应用中使用ANT在线编译不用重起tomcat的方法
- 想攒个主机(不要显示器),预算3000以内,主要是自己学习工作使用,希望大家给提点意见(能否借用首页啊?)!
- Asp.net Mvc Framework可以在Controller中使用的Url.Action方法
- 学习 jQuery - 4 使用方法选择
- Asp.net Mvc 的积木,谈Asp.net MVC中视图逻辑模块化和controller组件的使用方法
- [学习笔记]java web ServletContext.getRealPath(String str)方法的使用
- 详细讲解学习ASP Server对象使用方法
- 中午去找胡总学习不用存储过程实现传参防注入的方法