如何在 Unity 中除以四元数
How to divide by Quaternion in Unity
使用本教程 https://www.youtube.com/watch?v=waEsGu--9P8&list=PLzDRvYVwl53uhO8yhqxcyjDImRjO9W722 和四元数,我创建了一个函数,用于查找等轴瓦图的网格瓦片的世界位置。
private Vector3 GetWorldPosition(int x, int y, int r, int u, int f) {
return Quaternion.AngleAxis(u, Vector3.up) * Quaternion.AngleAxis(r, Vector3.right)
* Quaternion.AngleAxis(f, Vector3.forward) * new Vector3(x, y) * cellSize;
}
效果很好。它旋转 2D 网格以适应 Unity 等距 Tilemap。现在我需要做相反的事情——如果我知道 worldPosition,就得到瓷砖。我想,如果在前面的例子中我乘以四元数,现在我需要将 worldPosition.x 和 worldPosition.y 除以它们。但是这段代码
private void GetXY(Vector3 worldPosition, out int x, out int y, int r = 60, int u = 0, int f = 45) {
Quaternion rotation = Quaternion.AngleAxis(u, Vector3.up) * Quaternion.AngleAxis(r, Vector3.right)
* Quaternion.AngleAxis(f, Vector3.forward);
x = Mathf.FloorToInt(worldPosition.x / rotation / cellSize);
y = Mathf.FloorToInt(worldPosition.y / rotation / cellSize); }
连运行都不会,因为错误
"Operator '/' cannot be applied to operands of type 'Quaternion' and
'float'"
那么为什么我在第一种情况下可以将四元数和float cellSize相乘,而在第二种情况下不能将它们相除或相乘呢?
以及如何进行相反的操作?
感谢您的帮助,但 Inverse 没有成功。
所以我有 2D 网格,它旋转了 Z 轴 -45 度和 X 轴 60 度。它使网格等轴测。所以因为它旋转了 X 60 度,在 2D 视觉中这个网格在它自己的 X 和 Y 之间有超过 90 度(瓷砖是菱形)。而且我找到了确切的角度,我可以将其用于坐标 - x 和 y 不同。这个函数得到了适合我的瓷砖。
private Vector2Int GetXY(Vector3 worldPosition) {
Vector3 positionX = Quaternion.AngleAxis(-65, Vector3.forward) * worldPosition / cellSize;
Vector3 positionY = Quaternion.AngleAxis(-26, Vector3.forward) * worldPosition / cellSize;
return new Vector2Int(Mathf.FloorToInt(positionX.x * 1.55f), Mathf.FloorToInt(positionY.y * 1.55f));
}
使用本教程 https://www.youtube.com/watch?v=waEsGu--9P8&list=PLzDRvYVwl53uhO8yhqxcyjDImRjO9W722 和四元数,我创建了一个函数,用于查找等轴瓦图的网格瓦片的世界位置。
private Vector3 GetWorldPosition(int x, int y, int r, int u, int f) {
return Quaternion.AngleAxis(u, Vector3.up) * Quaternion.AngleAxis(r, Vector3.right)
* Quaternion.AngleAxis(f, Vector3.forward) * new Vector3(x, y) * cellSize;
}
效果很好。它旋转 2D 网格以适应 Unity 等距 Tilemap。现在我需要做相反的事情——如果我知道 worldPosition,就得到瓷砖。我想,如果在前面的例子中我乘以四元数,现在我需要将 worldPosition.x 和 worldPosition.y 除以它们。但是这段代码
private void GetXY(Vector3 worldPosition, out int x, out int y, int r = 60, int u = 0, int f = 45) {
Quaternion rotation = Quaternion.AngleAxis(u, Vector3.up) * Quaternion.AngleAxis(r, Vector3.right)
* Quaternion.AngleAxis(f, Vector3.forward);
x = Mathf.FloorToInt(worldPosition.x / rotation / cellSize);
y = Mathf.FloorToInt(worldPosition.y / rotation / cellSize); }
连运行都不会,因为错误
"Operator '/' cannot be applied to operands of type 'Quaternion' and 'float'"
那么为什么我在第一种情况下可以将四元数和float cellSize相乘,而在第二种情况下不能将它们相除或相乘呢? 以及如何进行相反的操作?
感谢您的帮助,但 Inverse 没有成功。
所以我有 2D 网格,它旋转了 Z 轴 -45 度和 X 轴 60 度。它使网格等轴测。所以因为它旋转了 X 60 度,在 2D 视觉中这个网格在它自己的 X 和 Y 之间有超过 90 度(瓷砖是菱形)。而且我找到了确切的角度,我可以将其用于坐标 - x 和 y 不同。这个函数得到了适合我的瓷砖。
private Vector2Int GetXY(Vector3 worldPosition) {
Vector3 positionX = Quaternion.AngleAxis(-65, Vector3.forward) * worldPosition / cellSize;
Vector3 positionY = Quaternion.AngleAxis(-26, Vector3.forward) * worldPosition / cellSize;
return new Vector2Int(Mathf.FloorToInt(positionX.x * 1.55f), Mathf.FloorToInt(positionY.y * 1.55f));
}