Questions tagged «quaternion»

数学构造,数字系统。在3D图形中,四元数与矢量和矩阵一起使用。四元数的好处之一是它们克服了矢量和矩阵固有的一些旋转问题(称为万向架锁)。

1
使模型面向目标
我有两个对象(目标和播放器),都具有位置(Vector3)和旋转(四元数)。我希望目标旋转并正对着玩家。目标射击时,应该向玩家射击。 我已经看到了很多关于播放器的示例,但是我不希望增量旋转,好吧,我想,只要我可以将播放器设置为100%,并且只要它确实起作用就可以。 仅供参考-我无法使用位置和旋转来做很多其他事情,而且除了我无法弄清楚的最后一件作品外,其他一切都很好。 代码示例在Target的类中运行,Position =目标位置,Avatar =玩家。 编辑 我现在正在使用他提供的Maik的C#代码,效果很好!
28 xna  c#  3d  models  quaternion 

5
通过四元数旋转vector3
我正在尝试通过给定的四元数旋转vector3。 我知道这是真的 v′=q⋅v⋅q−1v′=q⋅v⋅q−1 v' = q \cdot v \cdot q^{-1} 我知道是的逆,但是如何将向量的乘法映射到四元数以得到向量呢?q−1q−1 q^{-1} −qmagnitude(q)−qmagnitude(q) \frac {-q} {magnitude(q)} 我发现您可以将视为矩阵,并将和转换为矩阵,然后将从矩阵转换为向量,但这似乎只是为了获得向量而已。有没有我可以使用的更清洁的实现?vvvqqqq′q′q'v′v′v'
25 c++  quaternion 

2
使用四元数:我该怎么办?(没有数学)
我是游戏开发人员,没有学习数学。所以我只想使用四元数作为工具。为了能够进行3D旋转,有必要使用四元数(或矩阵,但在本问题中,我们先保留四元数)。我认为对于许多开发人员来说,使用它们很重要。这就是为什么我想分享我的知识并希望填补我的空缺。现在.... 据我了解: 四元数可以描述两件事: 3d对象的当前方向。 对象可以执行的旋转变换。(rotationChange) 您可以使用四元数: 乘法: 四元数endOrientation =四元数旋转Change *四元数currentOrientation; 因此,例如:我的3D对象向左旋转90°-我乘的旋转就是向右旋转180°,最后我的3D对象90°向右旋转。 四元数rotationChange =四元数endRotation * Quaternion.Inverse(startRotation); 这样,您将获得一个rotationChange,可以将其应用于另一个方向。 Vector3 endPostion =四元数rotationChange * Vector3 currentPosition; 因此,例如:我的3D对象位于位置(0,0,0)上,并且我乘以的旋转是向右旋转180°,我的端点类似于(0,-50,0)。在四元数内部有一个轴-以及围绕该轴的旋转。您围绕该轴Y度旋转点。 Vector3 rotationOffsetVector =四元数rotationChange * Vector3 currentOffsetVector; 例如:我的开始方向显示为UP-(0,1,0),我乘以的旋转方向是向右旋转180°,我的结束方向显示为向下。(0,-1,0) 混合(Lerp和Slerp): 四元数currentOrientation =四元数.Slerp(startOrientation,endOrientation,插值器) 如果插值器为1:currentOrientation = endOrientation 如果插值器为0:currentOrientation = startOrientation Slerp插值更精确,而Lerp插值更高效。 我的问题: 我到目前为止所解释的一切都正确吗? 四元数可以做到这一点吗?(不可以) 您还能对他们做什么? 两个四元数之间的点积和叉积有什么好处? 编辑: 更新了问题并提供了一些答案



2
人们为什么使用四元数?
我已经将它们用作黑匣子已有一段时间了,我只是在学习数学,但我想对此问题给出一些明确的答案。 到目前为止,我个人遇到的唯一好处是能够在两个角度之间进行SLERP-要用向量实现相同的效果,您需要进行一些麻烦的工作(本质上将0和2PI链接在一起)。

2
如何围绕3D中的任意点(而不是原点)旋转?
我有一些模型,我希望使用四元数以正常方式旋转,除了希望绕原点旋转以外,我希望它稍微偏移一些。我知道您并不是说在3D空间中绕点旋转。你说你绕轴旋转。因此,我将其可视化为围绕尾部不在本地原点的向量旋转。 我的渲染/物理引擎中的所有仿射变换都使用SQT(比例尺,四元数,平移;从Game Engine Architecture一书中借来的一个想法)存储。因此,我从这些组件中构建每个帧的矩阵,并将其传递给顶点着色器。在此系统中,先平移,然后缩放,然后旋转。 在一种特定情况下,我需要在世界空间中平移对象,对其进行缩放并围绕不以该对象的本地原点为中心的顶点旋转它。 问题:考虑到上述当前系统的限制,如何实现围绕原点以外的点进行局部旋转?自动支持任何可以仅使用矩阵描述如何执行此操作的人:)

3
如何实现基于四元数的相机?
更新这里的错误是一个非常简单的错误。我错过了弧度到度的转换。如果您还有其他问题,则无需阅读全文。 我看了几本关于此的教程,当我以为自己理解时,便尝试实现基于四元数的相机。问题是,旋转大约10分钟后,它无法正常工作。10度会跳回-10度。我不知道怎么了 我正在使用openTK,它已经有一个四元数类。我是opengl的菜鸟,我只是出于娱乐目的而做,并不真正了解四元数,所以我可能在这里做一些愚蠢的事情。这是一些代码:(实际上,除了加载和绘制vbo的方法外,几乎所有代码(它取自于演示vbo-s的OpenTK示例)) 我将多维数据集加载到vbo中并初始化相机的四元数 protected override void OnLoad(EventArgs e) { base.OnLoad(e); cameraPos = new Vector3(0, 0, 7); cameraRot = Quaternion.FromAxisAngle(new Vector3(0,0,-1), 0); GL.ClearColor(System.Drawing.Color.MidnightBlue); GL.Enable(EnableCap.DepthTest); vbo = LoadVBO(CubeVertices, CubeElements); } 我在这里加载透视投影。每次我调整窗口大小时,它都会在开始时加载。 protected override void OnResize(EventArgs e) { base.OnResize(e); GL.Viewport(0, 0, Width, Height); float aspect_ratio = Width / (float)Height; Matrix4 perpective = …

6
3D图形编程的数学主题
已关闭。这个问题需要更加集中。它当前不接受答案。 4年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我了解3D图形编程需要以下数学主题。我已经在我的数学课程中开始其中一些学习。有人可以指出我的资源方向来解释它们如何应用吗?他们用来解决什么图形/游戏问题? 向量数学 矩阵数学 四元数 线性代数 据我所知,这些都是线性代数/矩阵主题。还需要其他主题吗?

2
球体的任意旋转
我正在编写一种机制,允许用户在球体表面周围移动。球面上的位置当前存储为theta和phi,其中theta是当前位置的z轴和xz投影之间的角度(即围绕y轴的旋转),并且phi是从y轴到该位置的角度。我解释得很差,但实际上theta = yaw,phi = pitch Vector3 position = new Vector3(0,0,1); position.X = (float)Math.Sin(phi) * (float)Math.Sin(theta); position.Y = (float)Math.Sin(phi) * (float)Math.Cos(theta); position.Z = (float)Math.Cos(phi); position *= r; 我相信这是正确的,但是我可能是错的。我需要能够在半径为的世界空间的起点处围绕球体表面在任意伪二维方向上移动r。例如,握持区W应相对于玩家的方向在球体上方向上移动。 我相信我应该使用四元数来表示球体上的位置/方向,但是我想不出正确的方法。球形几何不是我的强项。 本质上,我需要填写以下内容: public void Move(Direction dir) { switch (dir) { case Direction.Left: // update quaternion to rotate left break; case Direction.Right: // update …

1
四元数和围绕世界轴的旋转
免责声明:我是专业的游戏程序员,大多数时候都使用四元数,但对我而言它们接近于魔咒。我在数学方面相对在家,但是虚构的数字总是让我感到困惑。我倾向于将quats视为有用,并且最终会多次反转乘法。我试着像在有限成功的矩阵中那样对它们进行推理。 无论如何.... 以下是困扰我的事情。当我想围绕对象的局部轴旋转对象时,我将其旋转与代表要应用的旋转的四元数相乘。因此,它是局部空间中的旋转。 现在,如果要围绕世界空间中的轴旋转,我的推理将是:将世界空间中的旋转作为四元数。用四元数乘以对象旋转的逆数。这将使我的世界在局部空间中旋转。将我的旋转倍数与此新的四元数相乘。即:newRot = oldRot *(反oldRot * worldRot) 但是,我需要做的是newRot = oldRot *(逆向oldRot * worldRot)* oldRot。 为什么在与反quat相乘之后为什么还需要在应用它之前与自己的quat相乘?我知道一定有一个完美的正当理由,但我无法说出自己的出路,这让我感到沮丧。我尝试了各种常见问题解答,但大多数问题都涉及数学,因此我不太清楚。 有人可以像我5岁一样向我解释这一点吗?
11 quaternion 

1
沿曲线移动对象同时旋转它
我想沿着曲线移动物体。我希望在曲线的特定点上,物体可以改变速度并沿其轴旋转。 想象一下一架飞机飞往目的地。它具有必须遵循的路径,此外,还一直调整其速度和方向(航向,髓,堤)。 我能否请您提供以下信息: 什么样的曲线,用来平滑地插入对象 什么公式来使用可靠的插值,在那里我可以控制移动oject的速度,曲线节之间的过渡将是无缝 应从3D创作应用程序导出哪些信息 我应该为此使用四元数slerp()吗? 如果您知道一本有效地涵盖了该主题的书,那将使您收获最多。谢谢。

2
由于libGDX中不推荐使用Table.drawDebug,因此应该使用什么呢?
我正在按照“学习LibGDX游戏开发”一书来制作一个简单的游戏。我在菜单创建部分中,在其中创建一个舞台并使用调试边框对其进行渲染。 这本书说要使用,Table.drawDebug(stage)但是这个静态方法似乎已经从框架Table类中完全删除了。 我正在进口com.badlogic.gdx.scenes.scene2d.ui.Table; 下面是我的代码: @Override public void render(float deltaTime) { Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); if (debugEnabled) { debugRebuildStage -= deltaTime; if (debugRebuildStage <= 0) { debugRebuildStage = DEBUG_REBUILD_INTERVAL; rebuildStage(); } } stage.act(deltaTime); stage.draw(); Table.drawDebug(stage); } 最后一行,Table.drawDebug(stage);有编译错误"The method drawDebug(ShapeRenderer) in the type Table is not applicable for the arguments (Stage)" …

5
为什么在Vector3s中不能使用运算符'> ='?
我正在尝试获得一个矩形,以便在我称为_positionA和的两个位置之间移动_positionB。两者都是类型Vector3。矩形移动得很好。但是,到达时_positionB它不会像应该的那样朝相反的方向移动。 我回到代码中看一看。我得出的结论是,随着对象的移动,if代码中的语句错过了rects位置等于的框架_positionB。如果rects的位置大于或等于, 我决定将代码修改为反向_positionB。我的代码不太长,因此我将在下面显示它: using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

3
绑带旋转镜
我使用以下代码旋转游戏角色以观看目标: transform.rotation = Quaternion.Slerp(startQuaternion, lookQuaternion, turningNormalizer*turningSpeed/10f) startQuaternion是给定新目标时角色的当前旋转。 lookQuaternion是角色应查看的方向,其设置如下: destinationVector = currentWaypoint.transform.position - transform.position; lookQuaternion = Quaternion.LookRotation(destinationVector, Vector3.up); TurningNormalizer只是Time.deltaTime增加,并且turningSpeed是编辑器中给定的静态值。 问题在于,尽管角色在大多数情况下都应该旋转,但在必须接近180度时仍存在问题。然后它有时会抖动并镜像旋转: 在此绘制效果不佳的图像中,角色(右侧)开始转向左侧的圆圈。不仅仅是左右旋转,它还可以启动“镜舞”: 它开始向新面貌旋转 然后突然突然以相同的角度但在另一侧并继续旋转 它执行此“镜像”的时间很长,直到它看着目标为止。这是带有四元数的东西吗? 编辑1: 显然问题不是由旋转本身引起的。更有可能的问题是,角色在旋转时会朝着面部移动。作为限制角度,当允许角色移动时,面对和目标之间的角度会减少,并且有时会消除抖动/镜像旋转。 这当然引发了更多的问题,为什么角色不能同时没有问题地同时移动和旋转呢?机芯使用的代码: transform.Translate(Vector3.forward * runningSpeed/10f * Time.deltaTime);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.