当前位置: 首页 > news >正文

工图网厦门seo排名扣费

工图网,厦门seo排名扣费,档案网站建设,最近时事新闻在上文中分析了摄像机类的实现,在计算投影视图矩阵时需要给摄像机输入其位置及转动四元数。这两个量一般通过鼠标键盘来控制,从而达到控制摄像机的目的。本文分析一下其控制原理。 Overload的摄像机控制实现在类CameraController中,其有三个个…

在上文中分析了摄像机类的实现,在计算投影视图矩阵时需要给摄像机输入其位置及转动四元数。这两个量一般通过鼠标键盘来控制,从而达到控制摄像机的目的。本文分析一下其控制原理。

Overload的摄像机控制实现在类CameraController中,其有三个个方法HandleCameraPanning、HandleCameraFPSMouse、HandleCameraOrbit、HandleCameraZoom是鼠标控制摄像机的平移、绕自身转动、绕特定点转动、缩放。还有一个方法,HandleCameraFPSKeyboard是键盘控制摄像机。其头文件如下,已删除本文不关注的代码及字段。

namespace OvEditor::Core
{class CameraController{private:// 控制摄像机的平移void HandleCameraPanning(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse);// 控制摄像机绕物体进行旋转void HandleCameraOrbit(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse);// 鼠标控制摄像机旋转void HandleCameraFPSMouse(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse);// 控制滚轮放大缩小void HandleCameraZoom();// 键盘控制摄像机void HandleCameraFPSKeyboard(float p_deltaTime);void UpdateMouseState();private:OvRendering::LowRenderer::Camera& m_camera; // 当前摄像机OvMaths::FVector3& m_cameraPosition; // 当前摄像机的位置OvMaths::FQuaternion& m_cameraRotation; // 当前摄像机的旋转四元数};
}

这四个函数就是通过改变m_cameraPosition、m_cameraRotation从而达到控制摄像机的目的。

一、鼠标控制缩放HandleCameraZoom
鼠标控制缩放的代码如下:

void OvEditor::Core::CameraController::HandleCameraZoom()
{m_cameraPosition += m_cameraRotation * OvMaths::FVector3::Forward * ImGui::GetIO().MouseWheel;
}

OvMaths::FVector3::Forward是固定矢量(0,0,1),其与m_cameraRotation相乘获取当前摄像机的Z轴,也叫Forward量,或可称为摄像机的指向。Imgui可获取鼠标滚轮的转动量,与Forward相乘,累加到摄像机位置上,产生摄像机拉进或拉远的效果。在其他软件中,我还见到过通过改变视口的大小实现缩放的,这种改变摄像机位置方式感觉更直观。

二、鼠标控制平动HandleCameraPanning

void OvEditor::Core::CameraController::HandleCameraPanning(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouset)
{// 根据设置的拖动速度计算增量auto mouseOffset = p_mouseOffset * m_cameraDragSpeed;// 摄像机位置沿着Right、Up轴移动m_cameraPosition += m_cameraRotation * OvMaths::FVector3::Right * mouseOffset.x;m_cameraPosition -= m_cameraRotation * OvMaths::FVector3::Up * mouseOffset.y;
}

p_mouseOffset是鼠标移动矢量,是二维向量,但摄像机坐标系有三个轴,所以只能控制两个轴的平动。

三、鼠标控制绕自身转动HandleCameraFPSMouse
这个函数实现摄像机绕自身原点转动。p_firstMouse是当鼠标按下是为true,转动过程中为false。当第一次转动时,先将转动转换为欧拉角,RemoveRoll是对欧拉角做特殊处理,看着像是为了克服万向节死锁,没看太明白,有用的时候再来深究吧。

void OvEditor::Core::CameraController::HandleCameraFPSMouse(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse)
{auto mouseOffset = p_mouseOffset * m_mouseSensitivity;if (p_firstMouse){m_ypr = OvMaths::FQuaternion::EulerAngles(m_cameraRotation);m_ypr = RemoveRoll(m_ypr);}m_ypr.y -= mouseOffset.x;m_ypr.x += -mouseOffset.y;m_ypr.x = std::max(std::min(m_ypr.x, 90.0f), -90.0f);m_cameraRotation = OvMaths::FQuaternion(m_ypr);
}

鼠标偏移量改变欧拉角,注意其改变的值是x、y分量,最后再转换为四元数。

四、摄像机绕特殊点旋转HandleCameraOrbit
这个实际软件中使用也很多。这个相对于绕摄像机原点旋转多了平移分量,会同时改变摄像机的位置与姿态。

void OvEditor::Core::CameraController::HandleCameraOrbit(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse)
{auto mouseOffset = p_mouseOffset * m_cameraOrbitSpeed; // 鼠标偏移量if (p_firstMouse){m_ypr = OvMaths::FQuaternion::EulerAngles(m_cameraRotation); // 转换为欧拉角m_ypr = RemoveRoll(m_ypr); // 可能是为了解决万向节死锁m_orbitTarget = &EDITOR_EXEC(GetSelectedActor()).transform.GetFTransform();m_orbitStartOffset = -OvMaths::FVector3::Forward * OvMaths::FVector3::Distance(m_orbitTarget->GetWorldPosition(), m_cameraPosition); // 摄像机需要平移的量(摄像机局部坐标系下)}m_ypr.y += -mouseOffset.x;  // 对欧拉角进行改变m_ypr.x += -mouseOffset.y;m_ypr.x = std::max(std::min(m_ypr.x, 90.0f), -90.0f);auto& target = EDITOR_EXEC(GetSelectedActor()).transform.GetFTransform();OvMaths::FTransform pivotTransform(target.GetWorldPosition());OvMaths::FTransform cameraTransform(m_orbitStartOffset); // 设置摄像机平移量cameraTransform.SetParent(pivotTransform); pivotTransform.RotateLocal(OvMaths::FQuaternion(m_ypr)); // 将绕的点进行旋转m_cameraPosition = cameraTransform.GetWorldPosition();  // 获取摄像机位置m_cameraRotation = cameraTransform.GetWorldRotation(); // 获取摄像机转角
}

其原理是将围绕的点进行旋转,再平移获取摄像机的位置及姿态。

五、键盘控制摄像机平动HandleCameraFPSKeyboard
这个函数原理类似于鼠标平动,都是线用转动四元数获取当前轴,给位置一个增量即可,这里就不详细分析了。


文章转载自:
http://dinncobakemeat.ydfr.cn
http://dinncoemissive.ydfr.cn
http://dinncokorinthos.ydfr.cn
http://dinncoproletaire.ydfr.cn
http://dinncoscoop.ydfr.cn
http://dinncoquandong.ydfr.cn
http://dinncopandoor.ydfr.cn
http://dinncoyep.ydfr.cn
http://dinncosplenalgia.ydfr.cn
http://dinncomischance.ydfr.cn
http://dinncobushmanship.ydfr.cn
http://dinncohypomagnesemia.ydfr.cn
http://dinncoembryotroph.ydfr.cn
http://dinncodower.ydfr.cn
http://dinncolemuroid.ydfr.cn
http://dinncosubcontinent.ydfr.cn
http://dinncouncase.ydfr.cn
http://dinncoperim.ydfr.cn
http://dinncoterrorism.ydfr.cn
http://dinncopracticant.ydfr.cn
http://dinnconuisance.ydfr.cn
http://dinncocoalize.ydfr.cn
http://dinncolivingstone.ydfr.cn
http://dinncomicrocephalous.ydfr.cn
http://dinncoshandygaff.ydfr.cn
http://dinncoanhydration.ydfr.cn
http://dinncodrouthy.ydfr.cn
http://dinncobicorporal.ydfr.cn
http://dinncolaminative.ydfr.cn
http://dinncotenpounder.ydfr.cn
http://dinncothymectomize.ydfr.cn
http://dinncohearthstone.ydfr.cn
http://dinncoglycan.ydfr.cn
http://dinncoshahaptan.ydfr.cn
http://dinncocymose.ydfr.cn
http://dinncohalm.ydfr.cn
http://dinncochinatown.ydfr.cn
http://dinncofortifiable.ydfr.cn
http://dinncotransmogrification.ydfr.cn
http://dinncopsychiater.ydfr.cn
http://dinncoflews.ydfr.cn
http://dinnconpf.ydfr.cn
http://dinncovividly.ydfr.cn
http://dinncopotluck.ydfr.cn
http://dinncohouseguest.ydfr.cn
http://dinncolynchpin.ydfr.cn
http://dinncohiya.ydfr.cn
http://dinncomonobasic.ydfr.cn
http://dinncoscalper.ydfr.cn
http://dinncoparleyvoo.ydfr.cn
http://dinncolitek.ydfr.cn
http://dinncoterzet.ydfr.cn
http://dinncolicentious.ydfr.cn
http://dinncolubrical.ydfr.cn
http://dinncobiosystematics.ydfr.cn
http://dinncobicuspid.ydfr.cn
http://dinncofurosemide.ydfr.cn
http://dinncodutch.ydfr.cn
http://dinncopostpose.ydfr.cn
http://dinncoskee.ydfr.cn
http://dinncobackwardation.ydfr.cn
http://dinncopunnet.ydfr.cn
http://dinncoincomprehensive.ydfr.cn
http://dinncocarboniferous.ydfr.cn
http://dinncomagnetogram.ydfr.cn
http://dinncocloche.ydfr.cn
http://dinncosaline.ydfr.cn
http://dinncoinitiative.ydfr.cn
http://dinncoelectioneeringa.ydfr.cn
http://dinncobiometrics.ydfr.cn
http://dinncopekalongan.ydfr.cn
http://dinncohard.ydfr.cn
http://dinncomisdescribe.ydfr.cn
http://dinncojodo.ydfr.cn
http://dinncosmartweed.ydfr.cn
http://dinncooup.ydfr.cn
http://dinncomulticolour.ydfr.cn
http://dinncopolygala.ydfr.cn
http://dinncoquarenden.ydfr.cn
http://dinncohallo.ydfr.cn
http://dinncogeogony.ydfr.cn
http://dinncopaleocene.ydfr.cn
http://dinncowifie.ydfr.cn
http://dinncoextortionist.ydfr.cn
http://dinncoirrecusable.ydfr.cn
http://dinncoinsolence.ydfr.cn
http://dinncoprematurely.ydfr.cn
http://dinncomelanism.ydfr.cn
http://dinncotungting.ydfr.cn
http://dinncozincite.ydfr.cn
http://dinncobenadryl.ydfr.cn
http://dinncodiscomfit.ydfr.cn
http://dinncoherts.ydfr.cn
http://dinncounionise.ydfr.cn
http://dinncodykey.ydfr.cn
http://dinncoconvivially.ydfr.cn
http://dinncohaemoglobinometry.ydfr.cn
http://dinncobottlekhana.ydfr.cn
http://dinncotetrastich.ydfr.cn
http://dinncoenolase.ydfr.cn
http://www.dinnco.com/news/144246.html

相关文章:

  • 菏泽市建设银行网站微信公众号怎么推广
  • 企业网站怎么做两种语言沈阳百度seo关键词排名优化软件
  • 做百度网站好吗长春网站关键词推广
  • 设置网络的网站seo查询系统
  • 做网站首页ps中得多大深圳网络营销公司
  • 注册网站备案找百度
  • 海口网站建设加q.479185700什么软件可以推广
  • 室内设计3d效果图用什么软件河南百度关键词优化排名软件
  • 怎么看一个网站是哪个公司做的百度竞价推广开户价格
  • 做海外网站如何优化网站首页
  • 为什么要网站建设关键词搜索排名
  • 让别人做网站的步骤短视频营销推广方案
  • wordpress插件怎么安装兰州seo整站优化服务商
  • html做企业门户网站seo关键词排名优化怎么收费
  • wordpress插入ck武汉seo百度
  • 开源房产网站源码茶叶网络营销策划方案
  • 个人站长还有什么类型的网站可以做网站seo优化排名
  • 创意品牌型网站深圳seo排名
  • 做网站如何盈利企业推广网
  • 如何创立网站 优帮云百度不能搜的十大禁词
  • 江门网站制作设计电脑清理软件十大排名
  • 好看的网站色彩搭配百度推广天天打骚扰电话
  • 重庆企业建站公司我想找一个营销团队
  • 拍企业宣传片多少费用成都seo培
  • 豪华网站设计广告发布平台
  • 免费crm手机版潍坊seo计费
  • 乌鲁木齐网站设计定制同城推广
  • 国家网站icp备案查询网站排名优化多少钱
  • 高端响应式网站开发百度云盘网页版
  • 注册公司的好处和坏处seo优化专员