threejs球体旋转与场景旋转_threejs中矩阵旋转原理_makerotationaxis_biyusr的博客-程序员宝宝

技术标签: 球体旋转  旋转矩阵  threejs  

矩阵的概念

threejs中的矩阵

矩阵的应用

用于旋转一个几何体

创建一个立方体cube放到场景中;

绕向量(1,1,0)旋转30度

var axis = new THREE.Vector3(1,1,0); //创建一个三维向量

var rotWorldMatrix = new THREE.Matrix4(); //创建一个4*4矩阵

rotWorldMatrix.makeRotationAxis(axis.normalize(), 30 * Math.PI / 180 );

rotWorldMatrix.multiply(cube.matrix); // pre-multiply

cube.matrix = rotWorldMatrix;

cube.rotation.setFromRotationMatrix(cube.matrix);

旋转之前与之后对比

向量一定是从几何体中心指向外面?

能围绕一个不以圆点位起点的向量旋转?

代码详解

创建一个三维空间中的点

var axis = new THREE.Vector3(1,1,0);

打印出axios

THREE.Vector3(1,1,0).normalize()

axis.normalize() //返回一个向量,其方向与指定向量相同,但长度为一。

如:

var axis = new THREE.Vector3(10,20,0);

console.log( axis.normalize() ); //{x: 0.4472135954999579, y: 0.8944271909999159, z: 0}

(0.4472135954999579^2)+(0.8944271909999159^2)+(0^2) = 1

var axis1 = new THREE.Vector3(1,1,0);

console.log( axis1.normalize() ) //{x: 0.7071067811865475, y: 0.7071067811865475, z: 0}

(0.7071067811865475^2)+(0.7071067811865475^2)+(0^2) = 1

创建一个4*4的矩阵

var rotWorldMatrix = new THREE.Matrix4();

console.log( rotWorldMatrix )

将上面创建的4×4矩阵按照传入的轴旋转传入的弧度

rotWorldMatrix.makeRotationAxis( 旋转轴,旋转弧度 )

//Matrix4原型上的方法

//axis = axis.normalize() 值为 {x: 0.7071067811865475, y: 0.7071067811865475, z: 0}

//angle = 30 * Math.PI / 180 值为 pi/6

makeRotationAxis: function ( axis, angle ) {
var c = Math.cos( angle ); //Math.cos(π/6)

var s = Math.sin( angle ); //Math.sin(π/6)

var t = 1 - c;

var x = axis.x, y = axis.y, z = axis.z;

var tx = t * x, ty = t * y;

this.set(

tx * x + c, tx * y - s * z, tx * z + s * y, 0,

tx * y + s * z, ty * y + c, ty * z - s * x, 0,

tx * z - s * y, ty * z + s * x, t * z * z + c, 0,

0, 0, 0, 1

);

return this;

},

rotWorldMatrix.makeRotationAxis(axis.normalize(), 30 * Math.PI / 180 );

rotWorldMatrix初始值为{ elements:[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }

执行makeRotationAxis()之后的值为:

将按照旋转轴和弧度旋转完成的矩阵和几何体的矩阵相乘

rotWorldMatrix.multiply(cube.matrix);

//框架源码

multiply: function ( m, n ) {
if ( n !== undefined ) { //这里的n是undefined因为只传入一个值cube.matrix

return this.multiplyMatrices( m, n );

}

return this.multiplyMatrices( this, m );

},

multiplyMatrices: function ( a, b ) {
var ae = a.elements; //rotWorldMatrix.elements

var be = b.elements; //cube.matrix.elements

var te = this.elements; //ae和te是全等的

var a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];

var a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];

var a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];

var a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];

var b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];

var b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];

var b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];

var b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];

te[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;

te[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;

te[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;

te[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;

te[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;

te[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;

te[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;

te[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;

te[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;

te[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;

te[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;

te[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;

te[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;

te[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;

te[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;

te[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;

return this;

},
————————————————
版权声明:本文为CSDN博主「戴尔科技集团」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42299131/article/details/112813851

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/biyusr/article/details/116261398

智能推荐

SQL Server 表数据入库异常返回-2问题解答_取名字好难_yu的博客-程序员宝宝

DBCCCHECKTABLE('tableName');使用以上命令查看该表详情信息,如果报错类似如下信息,可以查看DBCC CHECKDB 数据库或表修复 - 曾伟 - 博客园进行解决[42000][Microsoft][SQLServerNativeClient10.0][SQLServer]表错误: B树链链接不匹配。[42000][Microsoft][SQLServerNativeClient10.0][SQLServer]表错误: B树链链接不匹配。(1...

Cadence招聘资深AE工程师(数字前端,后端,验证)_Tao_ZT的博客-程序员宝宝

Join us Now!简历请发送至:marco[email protected]工作地点:上海浦东芳甸路1155号北京市东城区北三环东路36号,环球贸易中心D座深圳市福田区深南大...

ARM DSP FPGA的技术特点和区别_douyuhua0918的博客-程序员宝宝

ARM、DSP、FPGA的技术特点和区别   在嵌入式开发领域,ARM是一款非常受欢迎的微处理器,其市场覆盖率极高,DSP和FPGA则是作为嵌入式开发的协处理器,协助微处理器更好的实现产品功能。那三者的技术特点以及区别是什么呢?下文就此问题略做了总结。ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、

git add 命令详解_git的add命令详解_很酷的站长的博客-程序员宝宝

1、git 会将工作区中的文件使用 hash sha-1 算法得到 40 位的 blob 对象 hash 字符串文件,文件中存储的是文件类型和使用算法压缩后的内容,如果查看文件的原始内容,需要使用。-A 参数会监控工作区的状态树,它会把工作区的所有变化提交到暂存区,包括修改(modified)、新文件(Untracked files)、删除的文件(deleted)。版本库: 在工作区中有一个隐藏目录 .git,这个不算工作区,而是 git 的版本库。工作区: 电脑中能看到的目录,也就是写代码的地方。

“git add -A”和“git add”之间的区别。_HuntsBot的博客-程序员宝宝

git add [--all | -A] 和 git add . 有什么区别?

【模板题】几种常见的Nim游戏(博弈论)_柃歌的博客-程序员宝宝

【题目描述】给定nnn堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。【输入格式】第一行包含整数nnn。第二行包含nnn个数字,其中第iii个数字表示第iii堆石子的数量。【输出格式】如果先手方必胜,则输出Yes。否则,输出No。【数据范围】1≤n≤1051≤n≤10^51≤n≤1051≤每堆石子数≤1091≤每堆石子数≤10^91≤每堆石子数≤109【输入样例】

随便推点

Python基础-*args和**kwargs魔法变量_python 3.6 **kwargs,_琦彦的博客-程序员宝宝

在学习Python时,总会遇到*args和**kwargs这两个魔法变量,那么它们到底是什么?首先,并不是必须写成*args和**kwargs。只有变量前面的*(星号)才是必须的,你也可以写成*var 和**vars,而写成*args 和**kwargs只是一个通俗的命名约定。1 *args的用法*args和**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。这

Fiddle使用_oppos69的博客-程序员宝宝

为什么要学习Fiddle在日常开发时调试接口,有时会需要抓HTTP包的需求。Fiddle就是一个跨平台的图形界面的HTTP抓包工具。抓包工具有很多,比如Wireshark,不过Wireshark更适合TCP/IP协议抓包。下载Fiddle下载了解HTTP协议请求方法方法描述GET请求指定的页面信息并返回实体主体POST向指定资源提交数据进行处理请求,数...

微博深度学习平台架构和实践_木子 微博 深度学习_csdn_csdn__AI的博客-程序员宝宝

作者简介: 黄波,微博机器学习平台技术负责人、资深架构师,负责微博机器学习平台和Feed算法系统。毕业于中科院计算所,熟悉Feed系统、推荐系统、分布式计算系统。 何沧平,微博深度学习平台架构师,主要负责深度学习算法在微博Feed个性化排序、个性化推荐等业务中的应用。毕业于中科院数学院,熟悉高性能计算,著有图书《OpenACC并行编程实战》。 责编:何永灿([email protected]...

helm java client_java代码实现helm部署_weixin_39899691的博客-程序员宝宝

1 pom文件加入依赖org.microbeanmicrobean-helm2.8.2.1.1.0io.nettynetty-tcnative-boringssl-staticjar代码实现final URI uri = URI.create("https://kubernetes-charts.storage.googleapis.com/wordpress-0.6.6.tgz");final ...

MySQL主从数据不一致,怎么办?_西海幼鸟的博客-程序员宝宝

先给大家说个身边的故事。小伙伴二狗最近面宇宙厂,前面被问MySQL索引、锁、主从复制原理时答的都很开心。当面试官问到:“你们遇到主从不一致的问题怎么解决呢?你有什么更好的方案吗?”二狗懵了。不就是读写时候走主,纯读走从吗。。难道还有什么别的办法?面试官:emmm……有。那我们换个问题,主从复制的方式有几种,你能讲讲吗?二狗:…… 问到盲点了面试官:答不上来没关系,您的情况我基本了解了。感谢您参加...

项目管理之敏捷开发总结_zhangxiaofan666的博客-程序员宝宝

瀑布模型:简单说就是先定好需求和相关文档,然后构建框架,然后写代码,然后测试,最后发布个产品一旦文档需求确定,开发人员就按文档开发,直到产品开发完后,才会拿出来给客户。不过这种方式基本不适应现今快速发展的市场现状了。弊端:1.接力棒的协作模式带来信息差:瀑布模式下,业务、产品、研发三方很少共同参与讨论。需求如同接力棒从业务方传递给产品经理,再从产品经理传递给研发团队。信息每经过一次传递都有损失,研...

推荐文章

热门文章

相关标签