今天在写threejs时,突然想到一个问题:一个3D物体需要旋转时,一般情况下简单的旋转我都是使用欧拉角,稍微复杂一些的情况我会把欧拉角转换成四元数进行旋转(欧拉角复杂旋转可能会产生的死锁问题),但是在threejs中object3D的旋转方法无论是使用setRotation(沿着x、y、z轴旋转)还是rotateOnAxis(按从原点到任意方向的向量进行旋转)都无法完成沿着一个不经过原点的轴进行旋转(或者是我没有发现),但是实际应用的情况是存在的,比如一个大箱子,再某种情况下我们需要他沿着y轴旋转,另一种情况,我们又需要他沿着它的底边翻转(相当于一个大箱子放在地上,人去推他把它翻了个个)。

(灵魂画风,中间那个点就是物体的原点,箭头是物体的旋转轴)

在opengles中,这种解决情况十分简单,我们只需要先保存这时的矩阵状态,然后向下移动世界坐标系,当世界坐标系的z轴和箱子的底边重合时进行旋转,旋转完成之后恢复之前保存矩阵即可。在u3d中也可以轻易地使用方法,设置一个轴的起点和终点让某个物体沿着这个轴旋转。

在threejs中没有这个方法,于是我想到了一种办法,先创建一个object相当于一个大的容器,然后把box执行翻箱子动作的旋转轴放到object的z轴上,然后把box添加为object的子类,当需要box沿y轴旋转时,转动box的y轴box.setRotationY(x);当需要翻箱子时则选中box的父类object的z轴object.setRotationZ(x);由于box是object的子类,当父类移动时,子类也会跟着移动,就像一个小盒子被粘在了一个大盒子内部一样,这样就实现了让box沿不经过原点的任意轴旋转。

(大概就是这么个意思~不会用win10的画板-- --)

其实这个技巧是巧妙的利用了子类和父类的关系,大家有什么更好的方法,可以告诉我~

最后发现这个网站,更加直观地说明了这个问题:https://jsfiddle.net/b4wqxkjn/5/

在threejs中对3D物体旋转的思考的更多相关文章

  1. Qt Creator中的3D绘图及动画教程(参照NeHe)

    Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...

  2. unity区分点击在3D物体还是2D UI上

    当场景中的3D物体需要响应点击,但同时有UI显示时,存在判断点击是在3D物体上还是UI上的问题,办法如下: 1. 射线检测所有2D 3D物体,有2D物体被检测到时表明当前有UI.但无论Physics2 ...

  3. unity 3D物体使用EventSystem响应事件

    在ugui中创建一个canvas 之后会自动创建一个EventSystem,用来处理UI上的时间响应.(可以通过UI>EventSystem创建EventSystem) EventSystem ...

  4. WebGL和ThreeJs学习6--射线法确定3D空间中所选物体

    一.在 threejs 中如何确定下图3D空间中鼠标点击位置的 object 对象? 二.射线法确定步骤及代码 //Three.js提供一个射线类Raycaster来拾取场景里面的物体.更方便的使用鼠 ...

  5. 转 threejs中3D视野的缩放实现

    Threejs基础部分学习知道透视相机new THREE.PerspectiveCamera(fov, aspect , near,far)中. fov视野角(拍摄距离)越大,场景中的物体越小.fov ...

  6. 用threejs 实现3D物体在浏览器展示

    用threejs 实现3D物体在浏览器展示,通过鼠标平移,缩放,键盘箭头按钮左右移动等功能展示. <!DOCTYPE html> <html> <head> < ...

  7. Unity 3D Intantiate过程中Transform 空物体和本体之间的关系

    想当年刚学Unity的时候,这个问题困扰了我好几天,因此来分享一下当初解决问题的思路. 我们通过Unity构建场景的过程中,经常发现一个现象,就是物体在拖进场景中后,我们会发现物体是反的,通过改变物体 ...

  8. ThreeJS中的点击与交互——Raycaster的用法

    基础概念 坐标系 我们的手机屏幕是二维的,但是我们展示物体的世界是三维的,当我们在构建一个物体的时候我们是以一个三维世界既是世界坐标来构建,而转化为屏幕坐标展示在我们眼前,则需要经历多道矩阵变化,中间 ...

  9. UNITY polygon collider不随物体旋转

    U3D中的一般包围框如 boxcollider, meshcollider, capsule collider等都会随物体旋转而旋转.然而polygon collider却不会. 补充:原来所有2D包 ...

随机推荐

  1. 遍历DOM树,each()遍历

    在<jQuery教程/理解选取更新范围>一节中,我们知道:当选择器返回了多个元素时,可以使用一个方法来更新所有的元素,不再需要使用循环. 然后有的时候需要遍历元素,怎么办? 使用each( ...

  2. [CI]CodeIgniter特性 & 结构

    ------------------------------------------------------------------------------------------------- 市场 ...

  3. php缩小png图片时,不损失透明色的办法

    做站点时,通常要将图片缩小成合适的尺寸,jpg图片缩小比较容易,png图片如果带了透明色的话,按照jpg的方式来缩小的话,就会造成透明色损失.那么如何处理,才能保存透明色呢? 主要是利用gd库的两个方 ...

  4. Windows组件下载地址

    Windows下载中心 http://www.microsoft.com/zh-cn/download/default.aspx IE10下载地址 http://www.microsoft.com/z ...

  5. js高级-递归调用

    函数调用自身 求1-100的和 var sum = 0; for(var i = 1; i<=100; i++){ sum += i } console.log(sum) //自己写的递归 va ...

  6. python 删除模块

    import systry:    import librabbitmqexcept Exception:    passelse:    version = getattr(librabbitmq, ...

  7. div下面多个a标签的点击事件,并且获取a的属性

    $('.fensiselect').on('click','a',function(){ var id= $(this).attr('fanid'); alert(id) })

  8. 只需两步获取任何微信小程序源码

    http://baijiahao.baidu.com/s?id=1601969343738344659&wfr=spider&for=pc

  9. Springboot 静态资源

    说下默认映射的文件夹有: classpath:/META-INF/resources classpath:/resources classpath:/static classpath:/public ...

  10. JMeter调试工具--Debug Sampler(转载)

    转载自 http://www.cnblogs.com/fengpingfan Debug Sampler添加路径:[添加 / Sampler / Debug Sampler],面板设置如下: 打开JM ...