Questions tagged «transformation»

游戏开发中的变换通常是指对点,向量和矩阵进行线性代数运算。

9
为什么我们移动世界而不是摄影机?
我听说在OpenGL游戏中,让玩家移动的方法不是移动相机,而是移动整个世界。 例如,这里是本教程的摘录:OpenGL视图矩阵 在现实生活中,您习惯于移动相机以更改特定场景的视图,而在OpenGL中则相反。OpenGL中的相机无法移动,并且被定义为面向负Z方向位于(0,0,0)。这意味着无需移动和旋转相机,而是围绕相机移动和旋转世界以构建适当的视图。 我们为什么要这样做?

2
我在两个轴上旋转一个对象,那么为什么它一直绕着第三个轴扭曲?
我看到很多问题经常出现,但都涉及到潜在的问题,但是它们都被给定功能或工具的细节所困扰。这是尝试创建一个规范的答案,我们可以在出现时向用户推荐-提供大量动画示例!:) 假设我们正在制作第一人称相机。基本思想是左右摇摆应偏航,上下左右俯仰。因此,我们编写了如下代码(以Unity为例): void Update() { float speed = lookSpeed * Time.deltaTime; // Yaw around the y axis using the player's horizontal input. transform.Rotate(0f, Input.GetAxis("Horizontal") * speed, 0f); // Pitch around the x axis using the player's vertical input. transform.Rotate(-Input.GetAxis("Vertical") * speed, 0f, 0f); } 或许 // Construct a quaternion or …

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
尽管使用了Time.deltaTime,但移动似乎与帧速率有关。
我有以下代码来计算在Unity中移动游戏对象所需的转换LateUpdate。据我了解,我对的使用Time.deltaTime应使最终的翻译帧速率独立(请注意CollisionDetection.Move(),仅用于进行射线广播)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

2
为什么我们需要第四个坐标除以z?
我在这里阅读回复: 图形卡将向量的第四个元素作为最终位置怎么办? “第四个组件是跟踪透视投影的技巧。进行透视投影时,您希望除以z:x'= x / z,y'= y / z,但这并不是可以通过对x,y,z的向量进行运算的3x3矩阵来实现。为此,标准的技巧是添加第四个坐标w,并声明x,y,z总是除以w在应用了所有转换之后以及在栅格化之前。” 但是我不明白为什么我们不能使用3x3矩阵除以z? 我们不能乘以 1/z 0 0 0 1/z 0 0 0 1/z 要得到 [x/z y/z 1] ?

2
如何使用累积矩阵变换解决万向节锁定问题
我正在阅读Jason L. McKesson的在线“学习现代3D图形编程”书 到目前为止,我要解决万向节锁定问题以及如何使用四元数来解决它。 然而,就在这里,在四元数页面上。 问题的一部分是,我们试图将方向存储为一系列3个累积的轴向旋转。方向是方向,而不是旋转。方向当然不是一系列旋转。因此,我们需要将船舶的方向视为方向,作为特定数量。 我想这是我开始感到困惑的第一个地方,原因是因为我看不到方向和旋转之间的巨大差异。我也不明白为什么方向不能通过一系列旋转来表示... 也: 为此,首先想到的是将方向保持为矩阵。当需要修改方向时,我们只需对此矩阵进行转换,将结果存储为新的当前方向。 这意味着应用于当前方向的每个偏航,俯仰和横滚都将相对于该当前方向。正是我们所需要的。如果用户应用正偏航,则希望该偏航相对于它们当前指向的位置而不是相对于某个固定坐标系旋转它们。 我理解这个概念,但是我不理解如果累积矩阵变换可以解决此问题,那么上一页中给出的代码不仅如此。 这是代码: void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glutil::MatrixStack currMatrix; currMatrix.Translate(glm::vec3(0.0f, 0.0f, -200.0f)); currMatrix.RotateX(g_angles.fAngleX); DrawGimbal(currMatrix, GIMBAL_X_AXIS, glm::vec4(0.4f, 0.4f, 1.0f, 1.0f)); currMatrix.RotateY(g_angles.fAngleY); DrawGimbal(currMatrix, GIMBAL_Y_AXIS, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); currMatrix.RotateZ(g_angles.fAngleZ); DrawGimbal(currMatrix, GIMBAL_Z_AXIS, glm::vec4(1.0f, 0.3f, 0.3f, 1.0f)); glUseProgram(theProgram); …

2
如何从变换矩阵中提取欧拉角?
我有一个实体/组件游戏引擎的简单实现。 变换组件具有设置局部位置,局部旋转,全局位置和全局旋转的方法。 如果将变换设置为新的全局位置,则局部位置也会更改,以在这种情况下更新局部位置,我只是将当前的变换局部矩阵应用于父级的变换世界矩阵。 在那之前,我没有任何问题,我可以获得更新的局部变换矩阵。 但是我正在努力如何在变换中更新局部位置和旋转值。我想到的唯一解决方案是从变换的localMatrix提取平移和旋转值。 对于翻译来说,这很容易-我只取第4列的值。但是轮换呢? 如何从变换矩阵中提取欧拉角? 是这样的解决方案右?: 要查找围绕Z轴的旋转,我们可以发现localTransform和X的X轴矢量之间的差值轴线parent.localTransform的矢量,结果存储在德尔塔,则:localRotation.z = ATAN2(Delta.y,德尔塔。X); 围绕X和Y旋转相同,只需要交换轴即可。

1
GLSL中的相对论着色器
我正在尝试实现一个GLSL着色器,该着色器有助于理解相对论的洛伦兹变换。 让我们拿两个与轴对齐的惯性观测器 O和O'。观察者O'处于运动中,观察者O具有速度v=(v_x,0,0)。 用O'坐标描述时,事件P' = (x',y',z',ct')已转换坐标(x,y,z,ct)= L (x',y',z',ct') 其中L是一个称为Lorentz变换的4x4矩阵,它可以帮助我们将事件P'的O坐标写入坐标中。 (有关详细信息,请参见http://en.wikipedia.org/wiki/Lorentz_transformation#Boost_in_the_x方向) 我已经写下了第一个初步的顶点着色器,该着色器在给定每个顶点速度的情况下应用了Lorentz变换,但是我无法使变换正常工作。 vec3 beta= vec3(0.5,0.0,0.0); float b2 = (beta.x*beta.x + beta.y*beta.y + beta.z*beta.z )+1E-12; float g=1.0/(sqrt(abs(1.0-b2))+1E-12); // Lorentz factor (boost) float q=(g-1.0)/b2; //http://en.wikipedia.org/wiki/Lorentz_transformation#Matrix_forms vec3 tmpVertex = (gl_ModelViewMatrix*gl_Vertex).xyz; float w = gl_Vertex.w; mat4 lorentzTransformation = mat4( 1.0+beta.x*beta.x*q , beta.x*beta.y*q , beta.x*beta.z*q , …

2
如何从转换矩阵中提取方向?
我有一个4x4的转换矩阵M,我想找出通过M转换后的球体的形状。(球体在原点,半径为1。) 我知道只要将M乘以(0,0,0,1)就可以找到中心。 但是,由于M可以挤压和旋转球体,因此半径成为问题。如何找出所得椭球的新半径?有什么办法找出方向吗? 更具体地说,我需要知道包围转换后的球体的边界球体的大小。换句话说,| M * V-M *(0,0,0,1)|的最大值是多少,其中V是单位矢量(原始球体上的一个点)。

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 

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.