Articles of 四元

一个万向节如何与欧拉旋转角度相连?

当我看到任何解释万向节locking的video时,他们使用万向节机器来解释它,并且我完全理解了对该机器的影响。 我不明白的是,欧拉角如何与万向节机器的工作原理有关。 我的第一个困惑来自以下几点: 欧拉角旋转坐标系,但轴保持正交。 万向节圈旋转,使两个旋转轴成为共线。 所以我不明白万向节机制怎么可以显示欧拉角如何工作。

Quaternion LookAt相机

我正在使用下面的代码来旋转实体来查看点。 glm::vec3 forwardVector = glm::normalize(point – position); float dot = glm::dot(glm::vec3(0.0f, 0.0f, 1.0f), forwardVector); float rotationAngle = (float)acos(dot); glm::vec3 rotationAxis = glm::normalize(glm::cross(glm::vec3(0.0f, 0.0f, 1.0f), forwardVector)); rotation = glm::normalize(glm::quat(rotationAxis * rotationAngle)); 这对我平常的实体工作正常。 但是,当我在我的相机实体上使用这个,我得到一个黑屏。 如果我在第一行翻转减法,以便将前向vector作为从该点到相机位置的方向,那么我的相机就可以工作,但自然,我的实体会旋转,从而在相反的方向上进行查看。 我计算相机的变换matrix,然后把相反的视图matrix,我传递给我的OpenGL着色器: glm::mat4 viewMatrix = glm::inverse( cameraTransform->GetTransformationMatrix() ); 正交投影matrix是使用glm :: ortho创建的。 怎么了?

旋转关于世界而不是对象本身使用Quaternion.Euler统一

[在stackexchange类似的问题上的其他答案没有帮助] 这个脚本给出了一些奇怪的输出 在运行这个脚本时如果我按了一下,然后是's',那么这个对象正确地在'z'轴和'x'轴上旋转,但是如果在这两种情况下按下箭头键或'a / s'轴永远。 我不明白为什么会这样。 我希望它总是随着世界轴旋转。 码: public float speed = 1; private int xtimesHit = 0; private int ytimesHit = 0; private int ztimesHit = 0; void Update () { if( Input.GetKeyDown( KeyCode.RightArrow ) ){ ztimesHit–; } if( Input.GetKeyDown( KeyCode.LeftArrow ) ){ ztimesHit++; } if( Input.GetKeyDown( "a" ) ){ ytimesHit++; } if( Input.GetKeyDown( […]

如何从Blender导入相机到Unity3D

在Blender中有几个摄像头可以输出到Unity3D。 它们被导出为空的GameObject ,这就是所期望的。 这个想法是让主摄像头成为摄像头空GameObject之一的孩子。 在搅拌机中,对于世界而言,+ Y是前进的,+ Z是向上的。 但相机是-Z向前,+ Y向上。 在Blender中,我必须将相机的旋转角度设置为(90,0,0),才能使相机不会朝下。 但它的相机并不面向与Blender相机相同的方向。 我试着用Y + 180旋转摄像机游戏对象,以使摄像机面对+ Z,摄像机GameObject ,然后将其位置和旋转归零。 我怎样才能有一个1:1从Blender导出到Unity3D的摄像​​头对象? 编辑 :我正在导出FBX二进制7.4文件。 编辑 :这是一个表格: Blender RotXYZ Unity global RotXYZ Expected rotation ( 0, 0, 0) ( 0, -90, 90) ( 90, 0, 0) (90, 0, 0) ( 0, -90, 0) ( 0, 0, 0) ( 0, 90, 0) […]

使用Quaternion设置角度的单轴旋转

我正在使用四元数表示一些对象的旋转,我想让用户可以使用文本框一次旋转一个轴,所以他会写对象旋转的角度(例如at X轴),则物体旋转被设置为该旋转。 我知道,这个操作q1 * q会按q1旋转q ,但是我不知道如何设置单个轴的旋转,难道有人帮我完成这个function吗? public void SetRotationX(float Angle) { }

为什么我的2D自上而下的游戏杆代码偶尔停止工作?

我正在从事2D自上而下的游戏,并且正在研究玩家控制。 我有以下代码当前控制一个球员精灵: void Update () { float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); float headingAngle = Mathf.Atan2(moveHorizontal, moveVertical); Debug.Log("Heading angle: " + (headingAngle * Mathf.Rad2Deg).ToString() + " degrees."); Quaternion newHeading = Quaternion.Euler(0f, 0f, headingAngle * Mathf.Rad2Deg); if (transform.rotation != newHeading && (moveHorizontal != 0f || moveVertical != 0f)) { Debug.Log("Turning. Rotation: " + transform.rotation […]

我应该如何在我的游戏引擎中处理四元数types?

我最近一直在为我的游戏引擎编写四元数类,并且遇到了问题。 首先,我应该为我的引擎使用单位四元数? 其次,我是否应该将函数自动标准化为四元数,还是应该把它交给用户? 每种可能的select有什么好处和坏处?

如何正确设置对象/节点的绝对旋转?

通常,当我想旋转Ogre场景中的一个对象/节点时,我调用节点的rotate()方法。 相对于当前的旋转而言,该节点在局部旋转。 因此,例如,当我从0旋转开始,然后围绕一个轴旋转5度两次,然后在第二次调用之后,对象总共旋转10度。 现在我需要直接设置节点/对象的绝对旋转,而不管它当前的旋转。 因此,说我不知道​​目前的旋转对象,我需要把它设置为X轴上的45度。 像setRotation() 。 我知道在SceneNode类中有一个setOrientation()方法,它需要一个四元数对象。 我也知道我可以得到当前的四元数。 我不知道:我如何使用/改变这个当前方向的四元数来设置节点的新的绝对旋转? PS:Crosspost在http://www.ogre3d.org/forums/viewtopic.php?f=2&t=77710

四元数方向/传感器

即使这在技术上不是一个游戏开发问题,但涉及四元数,我在这里发布。 我有一个9轴传感器,它给了我一个代表它的方向的世界框架(重力,磁北)四元数。 它被安装在跑步鞋的鞋带上(意味着传感器相对于鞋有一个“间距”偏移)。 这意味着传感器和鞋的旋转轴线是不同的。 如果我沿着它的纵向轴“滚动”鞋子,那么传感器就会找出一个圆锥体,四元数回归这个圆锥体的x,y,z,w分量。 我想要的是鞋的轴的“等效”四元数。 最终,派生Pitch,Roll,Yaw对于我们的一些非(非)四元数度量,如内翻。 欣赏任何指针,因为我迄今为止所尝试似乎没有工作。 谢谢! -Tim

如何避免魔方锁在魔方

我正在制作一个魔方程序。 这将模拟魔方。 我有万向节锁的问题。 我需要知道如何避免它。 据我的理解,我可以乘以特定的顺序x,y,z旋转matrix来获得我想要得到的旋转。 或者,我可以使用四元数,就像围绕单个用户定义的轴而不是x,y或z轴旋转一样。 我无法真正了解如何从其他两个轴获得结果轴。 (x,y,z)如何从我的欧拉旋转中得到我的四元数轴? 会不会再造成万向locking? 其中一个大问题是。 我不知道要做什么轮换。 我需要把它变成一般用途。 编辑:我的问题更多的文档: 我的欧拉matrix乘法看起来像这样 rotate = XMMatrixRotationX(content.mesh[meshToRotate[i]].rotation.x) * XMMatrixRotationY(content.mesh[meshToRotate[i]].rotation.y) * XMMatrixRotationZ(radians); content.mesh[meshToRotate[i]].rotation.z = radians; 由于万向节锁将暗示旋转中的最后一个轴出现问题。 当您尝试旋转前面或后面时,会出现问题。