Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 儿童旋转差分变换_C++_Opengl_Math_Matrix_Glm Math - Fatal编程技术网

C++ 儿童旋转差分变换

C++ 儿童旋转差分变换,c++,opengl,math,matrix,glm-math,C++,Opengl,Math,Matrix,Glm Math,我已经为一些转换操作的问题挣扎了一段时间。 更精确地确定应用于每个对象以获得另一个对象的值所需的变换。 我用的是OpenGL的C++。 假设场景中只有很少的对象 请注意,它仅用于预设问题,不能显示100%准确的结果。测试值和结果在底部 红色数字是一组对象的标记 所有对象都有一些位置、旋转和缩放参数 组1由两个锥体和一个盒子组成 第2组由两个锥体组成 我想做的是: -从组1中选择一个圆锥体, -计算所需的旋转和位置差,以匹配第2组中的一个锥体, -检查应用相同的旋转偏移和位置(相对)更改是否也会

我已经为一些转换操作的问题挣扎了一段时间。 更精确地确定应用于每个对象以获得另一个对象的值所需的变换。 我用的是OpenGL的C++。 假设场景中只有很少的对象

请注意,它仅用于预设问题,不能显示100%准确的结果。测试值和结果在底部

红色数字是一组对象的标记

所有对象都有一些位置、旋转和缩放参数

组1由两个锥体和一个盒子组成

第2组由两个锥体组成

我想做的是: -从组1中选择一个圆锥体, -计算所需的旋转和位置差,以匹配第2组中的一个锥体, -检查应用相同的旋转偏移和位置(相对)更改是否也会使第二个圆锥体以与组2中第二个圆锥体相同的方式工作。 -如果两者都匹配,则将此变换标记为正确,并将其应用于Group1中的其他对象(仅左框)。 -实现像Group3这样的目标

相反,我取得了一些错误的结果,比如在第4组。 在我的例子中,圆锥体是匹配的,但其他对象似乎有一些问题。 也许我在数学上弄错了什么

是否存在局部/全局轴问题

我是这样做的: 旋转差的计算

//based on this: diff * q1 = q2  --->  diff = q2 * inverse(q1) formula
const glm::vec3 startRot = Group1ConeRotation;//degrees
const glm::vec endRot = Group2ConeRotation;//degrees
const glm::quat B = glm::quat(DegToRad(startRot));
const glm::quat C = glm::quat(DegToRad(endRot));
glm::quat A = C * glm::inverse(B);
A = glm::normalize(A); 
const glm::vec3 globalEulerRotOffset = RadToDeg(glm::eulerAngles(A));
//result
const glm::vec3 RotationDifference = globalEulerRotOffset; 
为第一组(第二个圆锥体、长方体)中的所有其他对象应用变换差异

比较Group1Cone2是否与Group2Cone2匹配:

//just subtracktion of vec3 parameters and length calculation
if(glm::fastLength(Group2Cone2.Rotation - Group1Cone2.Rotation) < 1.0f && glm::fastLength(Group2Cone2.Position- Group1Cone2.Position) < 0.3f)
下面是一些测试结果

之前:

Group1:
Group1Cone1Rotation = (-90, 0, 0)
Group1Cone2Rotation = (-90, 0, 0)
Group1BoxRotation = (90, 0, 90)

Group2 (target):
Group2Cone1Rotation = (0, 0, -90)
Group2Cone2Rotation = (0, 0, -90)


Calculated GlobalRotationDifference to make Group1Cone1 matches Group2Cone1 rotation 
globalEulerRotOffset = (90, 0, -90)

Results after applying transform (Group4 instead of Group3):
Group1Cone1Rotation = (0, 0, -90) //matches
Group1Cone2Rotation = (0, 0, -90) //matches
Group1BoxRotation = (118.4572, -90.0001, -28.4566) //WRONG should be something like (0, 0, 90)

我猜你会体验到这个盒子的错位,因为旋转差包括一个使盒子“站立”的部分。您将看不到这一点,因为圆锥体对于绕其自身轴旋转是不变的。你能检查一下圆锥体的方位吗?通过两个旋转四元数的点积的绝对值,可以得到两个旋转的相似性。当处理3D转换时,操作顺序和引用是至关重要的。如果你试着像在这里那样手工做数学题,很容易出错。一般来说,只使用4d矩阵进行计算更简单,也不容易出现错误。
modelMatrix.SetIdentity();
modelMatrix.Translate(Object.position);
modelMatrix.ApplyMatrix(glm::mat4_cast(Object.Quaternion);
modelMatrix.Scale(Object.Scale);
Group1:
Group1Cone1Rotation = (-90, 0, 0)
Group1Cone2Rotation = (-90, 0, 0)
Group1BoxRotation = (90, 0, 90)

Group2 (target):
Group2Cone1Rotation = (0, 0, -90)
Group2Cone2Rotation = (0, 0, -90)


Calculated GlobalRotationDifference to make Group1Cone1 matches Group2Cone1 rotation 
globalEulerRotOffset = (90, 0, -90)

Results after applying transform (Group4 instead of Group3):
Group1Cone1Rotation = (0, 0, -90) //matches
Group1Cone2Rotation = (0, 0, -90) //matches
Group1BoxRotation = (118.4572, -90.0001, -28.4566) //WRONG should be something like (0, 0, 90)