查找旋转对象的坐标

Posted

技术标签:

【中文标题】查找旋转对象的坐标【英文标题】:Finding the coordinates of a rotated object 【发布时间】:2019-05-08 22:45:51 【问题描述】:

对于这个问题,我有 2 个感兴趣的对象。

    Obj1 是父对象,一个圆形精灵 Obj2 是一个嵌套的子对象,一个方形精灵

Obj1 有一个孩子叫 objHolder,在 objHolder 里面是 Obj2。 objHolder 的轴心点设置在 Obj1 的中间,而 Obj2 放置在 Obj1 的圆周附近。目标是旋转 objHolder,使 Obj2 看起来像是在 Obj1 的圆周上盘旋。

每一帧,objHolder 都会有一个新的旋转值,基于我界面中的一些其他输入值。

我的问题是,如何获取 Obj2(相对于 Obj1,而不是舞台)每帧的 x,y 坐标?

如果我使用 localToGlobal() 它不会考虑旋转值。有没有更简单的方法?

【问题讨论】:

【参考方案1】:

嗯,它应该考虑到轮换。你描述你有一个这样的嵌套结构:Obj1

无论如何,答案是使用两种翻译,首先从源到阶段,然后从阶段到目标。如果您想要一个对象在另一个对象的系统中的坐标,请执行以下操作:

p=target.globalToLocal(source.localToGlobal(new Point()));

在您的情况下,source 是 Obj2,target 是 Obj1。而且,new Point() 是源对象坐标系中坐标为 (0,0) 的点,也就是source 的轴心点。

【讨论】:

是的,当我旋转 objHolder 时,Obj2 确实会转动。它现在可以工作了,谢谢!当我第一次尝试时,由于我对 gtl/ltg 的工作原理缺乏了解,我没有想到将 globalToLocal 嵌套在另一个 localToGlobal 中。所以我一直认为它没有应用转换值,许多关于 gtl/ltg 的 SO 文章错误地推测转换也没有应用。感谢您的帮助:) 一个简单的问题,你能简单解释一下你提供的答案和这个有什么区别吗:Obj1.globalToLocal(new Point(Obj1.objHolder.Obj2.x, Obj1.objHolder.Obj2.y )); ? 您的代码尝试将 (Obj2.x,Obj2.y) 转换为 Obj1 的本地坐标。您只旋转 objHandler 而不会在其中移动 obj2,因此这一点是恒定的 - 如果对象的容器旋转,则不会更新对象的内部坐标。因此,您需要对全局坐标进行适当的转换才能获得正确的值。

以上是关于查找旋转对象的坐标的主要内容,如果未能解决你的问题,请参考以下文章

基于Three.js中的父/其他对象坐标系保持对象旋转?

将对象从一个坐标系旋转到另一个坐标系

如何在旋转场景中查找对象的全局位置 THREE.JS

Unity 2D C#如何在点击时制作面向对象的坐标

如何使用现代 OpenGL 的 GLM 或 JOML 矩阵正确转换(平移、旋转、缩放)对象

查找三个坐标系之间的旋转和平移