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

太原网站制作在线南宁网站建设

太原网站制作在线,南宁网站建设,wordpress默认模版在哪,wordpress 角色权限这里介绍一个小TIPS,很久没有这么有成就感了。我以前在学3D数学的时候,书上就有一句话,说你把矢量这些东西用久了,就应该形成一种“直觉”,仿佛这些东西就是你的左右手一样。而这次,我居然真的用“直觉”来…

这里介绍一个小TIPS,很久没有这么有成就感了。我以前在学3D数学的时候,书上就有一句话,说你把矢量这些东西用久了,就应该形成一种“直觉”,仿佛这些东西就是你的左右手一样。而这次,我居然真的用“直觉”来解决问题了,可以说是“瞎猫碰到死耗子”式的解决问题方法:

(一)问题起因

我现在在写的是一个软件光栅化的引擎。在软件光栅化的阶段,有两个地方可以进行光照渲染,一个是在世界空间下进行,一个是在相机空间下进行。在世界空间下进行会很方便,因为光照并不涉及旋转,而只是涉及平移。但是,因为矩阵乘法可以结合,所以从物体空间变换到世界空间再变换到相机空间,这两个矩阵可以合二为一,因为我是写软件光栅化,所以节约一些算力是有必要的。

 (二)矢量旋转的问题

我有一个平行光。平行光是没有距离的,只有方向,这个方向用一个矢量(像Vector3(1,1,1)这样)。但在旋转中有两个问题:

1、矢量的旋转不像点的旋转。顶点是可以通过矩阵进行旋转的,但是矢量不行。虽然在数学上矢量和点都是等价的。但是因为旋转属于非线性变换,所以最终在数学上的结果(归一化)之后,这个矢量方向其实不是你想要的矢量。

2、从世界空间到相机空间的旋转,其实是一个旋转的逆运算。也就是说,相机的Rotation,不是将世界空间按这个Rotation旋转,而是要做逆旋转。

(三)解决的过程

当时我想了一些歪门邪道。开始的时候我尝试用两个点记录位置。比如将矢量转化为P1和P2。然后使用这P1和P2进行相机旋转,因为P1和P2就是两个点,点旋转之后,之间的位置关系是不变的。在旋转之后,再取这两个点计算矢量方向。理论上应该可行,但不知道为什么失败了。

后来我将角度反转,然后进行四元数的矢量旋转乘法,四元数的矢量乘法公式如下:

V=要变换的矢量(要进行齐次变化,W设置为0),Q=旋转的四元数,Q-1=四元数的逆

V = Q * V * (Q-1)

没到想居然成功了。这样得到的矢量居然是可以用的。光照计算没有问题。但是为什么我说瞎猫碰到死耗子?因为在我的变换矩阵中有一个BUG。相机变换矩阵是按照XYZ三个轴进行变换的。我使用的是Unity的规则,按照Z-X-Y(Roll-Pitch-Yaw)的顺序变换。我在写相机变换矩阵的时候,也是这么写的。但是我忘记了,相机变换是一个逆变换,其实应该写成Y-X-Z变换的。其实先后顺序只是规则的问题,你怎么写,实际变换上也不会出错。所以我一开始没看出这个BUG。

但是后来我在进行相机的旋转控制的时候,我发现我的旋转控制有问题:在进行了Yaw的旋转之后,再使用Pitch会沿Y轴旋转,而不是在地平线旋转。虽然在数学上这没有问题,但做为玩家控制来说有大问题。这也是为什么Unity使用Z-X-Y旋转顺序的原因。

然后查出BUG之后,才知道是我的旋转搞错了。我就把旋转改了。但这样一改,原来那个我将角度反转之后,再利用四元数旋转的方法就失灵了,得到的是一个错误的结果。

(四)解决方法

这里就是靠“直觉”解决问题了。如果将角度反转没有作用,那么,将四元数的运算反转呢?这是一个突发奇想,我在教程,书里面都没有见过这种说法,所以我说“瞎猫碰到死耗子”,当然,这应该也有其它书里面说,只是我没看到而已。但总之这个思路解决了问题。只需要将四元数旋转的运算改变,就能够得到一个能成功变换到相机空间的矢量:

使用逆运算公式:V = (Q-1) * V * Q

// 旋转矢量
Vector3 RotateDirection(Vector direction, Quaternion rotation)
{Quaternion re(rotation.GetEular());Vector3 transDirection = re.RotateMulInverse(direction);return transDirection.Normalize();
}// 求四元数的逆
Quaternion Quaternion::GetInverse(void) const {// 这是四元数的长度// 因为四元数长度始终是单位1,所以其实这一步可以省,只要你确保它没发生蠕变float len = Magnitude(); return Quaternion(-x / len, -y / len, -z / len, w / len);
}// 四元数的乘法(正常)
Vector3 Quaternion::RotateMul(const Vector3& v) const {Quaternion vq(v.x, v.y, v.z, 0.0);Quaternion r = *this * vq * this->GetInverse();return Vector3(r.x, r.y, r.z);
}// 四元数的乘法(逆向)
Vector3 Quaternion::RotateMulInverse(const Vector3& v) const {Quaternion vq(v.x, v.y, v.z, 0.0);Quaternion r = this->GetInverse() * vq * (*this);return Vector3(r.x, r.y, r.z);
}

OK。以上就是解决方案了。

http://www.yayakq.cn/news/213571/

相关文章:

  • 前端设计除了做网站还能做什么建设科技期刊官网
  • php网站后台上传不了图片网上做平面设计的网站
  • 网站建设推广平台网址wordpress怎么编辑网页
  • 跨境电商平台一览表长沙网站搭建seo
  • 华为手机网站建设策划方案论文pc网站还有必要做吗
  • 自学建设网站中山楼市最新消息
  • 350做网站深圳手表网网站
  • wordpress做电影网站创造一个网站
  • pc端微信端网站建设无锡高端网站建设
  • wordpress小图标网站常见的网上购物平台有哪些
  • php做网站图集精准营销推广
  • 做一个中文域名购物网站要多少钱应用网站制作
  • 网站怎么建设好看网页设计图片格式
  • 金融投资管理公司网站源码做3个网站需要多大的服务器
  • 网站开发需求收集手机微信网站模板
  • 爱漫画-只做精品的韩漫网站wordpress 能源插件
  • 网站建设调查报告范文佛山关键词自动排名
  • 内江市规划建设教育培训中心网站wordpress 左右图文排版
  • 实时网站推广的最终目的是老域名做网站好吗
  • storyset自定义插画网站顶呱呱网站建设价格
  • php网站开发面试题龙岗外贸网站建设公司
  • 网站建立不安全怎么设置通过做网站新闻
  • 用什么网站做浏览器主页制作app软件要多少钱一个
  • 那个网站可以做logo网站icp备案信息是什么意思
  • 商丘网站制作案例网站做链接代码
  • 做网站购买服务器吗安阳淘宝网站建设
  • 专业网站建设公司排名如何申请一个网站 新网
  • 介绍几个免费的网站黄岩区建设规划局网站
  • 做模板网站的公司建e室内设计网 3d模型医美前台
  • 有哪些营销型网站新媒体配图的相关知识