看这篇博客,默认你已经知道了3D模型实现三维空间内旋转的实现方式(矩阵、欧拉角、四元数)。

ok,下面正式切入主题,房门的打开和关闭,先上图:

正如你所看到的那样,这个“房门”已经被打开了。

一、three.js中物体的旋转

object.rotation.set(angleX,angleY,angleZ);

这是three.js为object3D类(基本上所有的物体都是继承自这个类的)提供的自旋转API;

为什么叫自旋转呢,就像地球自转和公转一样,自旋转表示绕物体自身中心点(局部坐标系)旋转;

所以如果使用上面的旋转API进行门的旋转的话,你将得到以下结果:

代码如下:

object.rotation.set(,-Math.PI/,);

沿Y轴旋转30度,跟我们的期望有一点差距,我们希望沿着门的右边那条线旋转。

那么有哪些方法呢?

二、实现门沿着指定边“旋转”

这个旋转打了一个双引号,所以,他不仅仅是调用旋转API那么简单!

①自旋转+平移

var rotationY = currentCube.rotation.y;
currentCube.rotation.set(,rotationY - Math.PI/,);
currentCube.position.setX(currentCube.position.x + 0.4);
currentCube.position.setZ(currentCube.position.z - 0.75);

代码很简单,先沿着Y轴自旋转30度,然后X、Z轴平移合适的距离来实现最终的效果;

其实这个合适的距离是可以通过旋转角和门的宽度计算出来的,我这里为了大家看得直白一点,就直接用数据代替了。

②添加父容器,旋转父容器

ok,原理就像上图所示的那样,我们“装门”的时候,假如,门的尺寸是50X220,那么我们可以用一个100X440的盒子将这个门包起来;

然后这个门在左边区域,如你所见的那样,然后门要打开的时候,我们直接将110X440的盒子进行自旋转就行了。

个人认为,这种方法比较繁琐,故没有进行代码上的实现,如果你有兴趣,不妨一试。

三、three.js中的自旋转方法

同样是Y轴自旋转30度,three中的实现方式有如下几种(都是自旋转):

①法一

object.rotation.set(,Math.PI / ,);

②法二

var axis = new THREE.Vector3(,,).normalize();
var angle = Math.PI / ;
object.rotateOnAxis(axis,angle);

三维向量归一化作为旋转轴,加上角度,当然这个向量可以是以圆点为起点的任意向量,如果以(1,1,0)为旋转轴的话,旋转效果如下:

③法三

var quaternion = new THREE.Quaternion();
quaternion.setFromAxisAngle( new THREE.Vector3( , , ).normalize(), -Math.PI / );
object.applyQuaternion( quaternion);

四元数旋转的three实现,传入归一化的旋转轴和旋转角度来初始化旋转四元数,然后作用于物体上,从而实现旋转

④法四

function rotateAroundWorldAxis(object, axis, radians) {
var rotWorldMatrix = new THREE.Matrix4();
rotWorldMatrix.makeRotationAxis(axis.normalize(), radians);
rotWorldMatrix.multiply(object.matrix);
object.matrix = rotWorldMatrix;
object.rotation.setFromRotationMatrix(object.matrix);
}

这是一个旋转函数,形参分别为物体对象、旋转轴(3维向量)、角度

先根据传入参数初始化一个旋转矩阵;

右乘物体的视图矩阵;

将添加了旋转动作的新矩阵作用于物体对象上;

四、three.js中物体在世界坐标系下旋转

敬请期待

three.js中物体旋转实践之房门的打开与关闭的更多相关文章

  1. JS中调用android和ios系统手机打开相机并可选择相册功能

    编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/57626154 实现android手机打开相机选择相册 ...

  2. 三维空间旋转和Three.JS中的实现

    三维空间中主要有两种几何变换,一种是位置的变换,位置变换和二维空间的是一样的.假设一点P(X1,Y1,Z1) 移动到Q(X2,Y2,Z2)只要简单的让P点的坐标值加上偏移值就可以了.但是三维空间的旋转 ...

  3. 4.three.js中的坐标系

    Three.js中的坐标系 three.js中坐标系使用的是左手坐标系 左手坐标系和右手坐标系的对比: 当然three.js中使用的是右手坐标系 three.js中的旋转的定义 但是three.js中 ...

  4. 工厂模式在JS中的实践

    .mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑 ...

  5. Cookie和Session在Node.JS中的实践(三)

    Cookie和Session在Node.JS中的实践(三) 前面作者写的COOKIE篇.SESSION篇,算是已经比较详细的说明了两者间的区别.机制.联系了.阅读时间可能稍长,因为作者本身作图也做了不 ...

  6. Cookie和Session在Node.JS中的实践(二)

    Cookie和Session在Node.JS中的实践(二) cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的实践(一)已经是写得算是比较详细了,有兴趣可以翻看,这篇是s ...

  7. node.js+react全栈实践-Form中按照指定路径上传文件并

    书接上回,讲到“使用同一个新增弹框”中有未解决的问题,比如复杂的字段,文件,图片上传,这一篇就解决文件上传的问题.这里的场景是在新增弹出框中要上传一个图片,并且这个上传组件放在一个Form中,和其他文 ...

  8. Require.js中的路径在IDEA中的最佳实践

    本文主要讲述require.js在IDEA中路径智能感知的办法和探索中遇到的问题. 测试使用的目录结构:一种典型的thinkphp 6的目录结构,如下图. 现在我通过在 vue-a.js 中运用不同的 ...

  9. three.js中的矩阵变换(模型视图投影变换)

    目录 1. 概述 2. 基本变换 2.1. 矩阵运算 2.2. 模型变换矩阵 2.2.1. 平移矩阵 2.2.2. 旋转矩阵 2.2.2.1. 绕X轴旋转矩阵 2.2.2.2. 绕Y轴旋转矩阵 2.2 ...

随机推荐

  1. context容器上下文件

    在web项目中想要获取哪个bean,得先得到容器上下文context public class MyLoaderListener extends ContextLoader implements Se ...

  2. spring ObjectFactory

    AspectJAwareAdvisorAutoProxyCreator implements PostProcessor postProcessorAfterInitialization(Object ...

  3. linux NFS配置案例

    1.查看NFS软件包        [root@server7 ~]# rpm -qa | egrep "nfs|rpcbind" 2.安装NFS和RPC服务        [ro ...

  4. ab测试nginx Nginx性能优化

    转自:https://www.cnblogs.com/nulige/p/9369700.html 1.性能优化概述 在做性能优化前, 我们需要对如下进行考虑 1.当前系统结构瓶颈 观察指标 压力测试 ...

  5. visudo修改编辑器vim

    update-alternatives --config editor

  6. [洛谷P4040] AHOI2014 宅男计划

    题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 问题描述 外卖店一共有N种食物,分别有1到N编号.第i种食物有固定的价钱Pi和保质期Si.第 ...

  7. GO 语言队列实现

    队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的t(First In First Out)的线性表,简称FIFO.允许插入的一端为队尾,允许删除的一 ...

  8. 织梦M手机端/自适应网站内容图片变形解决办法

    我们在做响应式网站或者织梦M功能手机站的时候,会发现如果内容页图片太大,在移动端显示会变形,dede手机端图片过长等问题,手机端文章内容页图片不能自适应!这给通过手机端浏览网站的用户造成了很不好的用户 ...

  9. LOJ #6145. 「2017 山东三轮集训 Day7」Easy 点分树+线段树

    这个就比较简单了~ Code: #include <cstdio> #include <algorithm> #define N 100004 #define inf 1000 ...

  10. Anaconda cheat sheet

    1 anaconda prompt 闪退的情况 在cmd中进入C:\ProgramData\Anaconda3\Scripts然后可以使用各种conda命令 2 anaconda 换源 # 方法参考 ...