具有三个轴旋转的项目的 3D 边界框
3D bounding box for an item with three axis rotations
我试图找到最终成为所有三个轴旋转中旋转形状的边界框的 大小。尽管为了简单起见,下面演示的示例仅旋转了 x 轴。
vector Size = <10,1,0.5>; vector Deg = <22.5,0,0>
if(Deg.x > 0 && Deg.y == 0 && Deg.z == 0){
Y1 = Cos(Deg.x) * Size.y + Sin(Deg.x) * Size.z;
Z1 = Cos(Deg.x) * Size.z + Sin(Deg.x) * Size.y;}
下面是 y 和 z 旋转,也就是说,如果您决定将度数更改为 <0,22.5,0> 和 <0,0,22.5>。
if(Deg.y > 0 && Deg.x == 0 && Deg.z == 0){
X2 = Cos(Deg.y) * Size.x + Sin(Deg.y) * Size.z;
Z2 = Cos(Deg.y) * Size.z + Sin(Deg.y) * Size.x;}
if(Deg.z > 0 && Deg.x == 0 && Deg.y == 0){
X3 = Cos(Deg.z) * Size.x + Sin(Deg.z) * Size.y;
Y3 = Cos(Deg.z) * Size.y + Sin(Deg.z) * Size.x;}
虽然我迷失的部分是,如果你有两个或三个轴的旋转,我从这里去哪里。如 <22.5,22.5,0> 或 <22.5,22.5.22.5>
是否有包含我可以查看的教程或示例方程式的网站,或者是否有关于我可以做些什么来解决这个问题的任何提示或想法。
编辑:
我确实想补充一点,Nico 的评论有所帮助,因为我要问的是:轴对齐边界框或简称 AABB。
至于 JohanC 关于 22.5 的评论,是的,Deg = Degree。另外,是的,您必须将度数转换为弧度,但我在 Sin 和 Cos 输入的示例中将其作为度数以保持简单。
如果您想知道这个问题有何用处。举个例子,你需要知道 AABB 来帮助方程式,如果你要说调整项目的大小,而它有 旋转不是完美的零旋转。
经过大量的测试和调试,我找到了自己的解决方案。我将展示和解释我创建的脚本的一小部分,因为功能和选项因编码语言而异。
有关以下示例脚本的一些详细信息。度 = 度数。虽然是的,JohanC 提到的关于弧度的内容是正确的,因为即使是我使用的语言,我也必须使用函数将度数转换为弧度。并非每种语言或计算器都是这样,但为了使其更易于阅读的意图和目的,我确实去掉了多余的部分,同时保持 code/equation 的内容完好无损。同样在这个例子中,我在 Z 轴上旋转它来演示并作为起点。
vector Size = <10,1,0.5>; //Insert your own coding language function
//for splitting the size in half with positive and negative halves.
vector min = <-5,-0.5,-0.25>; vector max = <5,0.5,0.25>;
//You'll need at least 8 points in total to do this correctly.
//I already have 8 points added down below, labeled p1 - p8
vector p1 = <max.x,max.y,max.z>; vector p2 = <max.x,min.y,max.z>;
vector p3 = <max.x,max.y,min.z>; vector p4 = <max.x,min.y,min.z>;
vector p5 = <min.x,max.y,max.z>; vector p6 = <min.x,min.y,max.z>;
vector p7 = <min.x,max.y,min.z>; vector p8 = <min.x,min.y,min.z>;
vector Deg = <0,0,22.5>
//This will give you an idea of how to setup the x,y,z for each point
//equation to make / change to fit the rotations. Plus to make it compact
//I suggest that you use list, a while loop, and etc.
x1 = p1.x * llCos(Deg.z) - p1.y * llSin(Deg.z);
y1 = p1.y * llCos(Deg.z) + p1.x * llSin(Deg.z);
我在上面的示例中保留的很多内容是几个列表、true 和 false 语句、while 循环和其他一些东西。尽管显示它的不那么复杂的部分以及并非每种语言都具有相同的可用功能这一事实保持简单。
虽然一旦你获得了收集到的8个点的所有位置数据,你就可以将每个x,y,z点信息放入自己的列表中。然后 运行 等式(根据每次旋转的需要进行编辑)。之后,从每个轴旋转输出中获取最大值和最小值。然后取最大值并从中减去最小值,因为最小值始终为负数。那里会给你边界框的 大小。
我确实想补充一点,Nico 的 link 略有帮助,尽管它的唯一缺陷是“如果”您使用的语言允许矩阵或“如果”您能够创建一个多维数组。如果你能做到,那么使用 Nico 提供的 link 看看是否有帮助。
还有一些 JohanC tips/hints 也提供了帮助。说到这一点,当且仅当您使用 8 点方法时,关于“使用从一个旋转到下一个旋转的矢量输出”的部分才有效。否则,如果您尝试它的边界框大小是一个到下一个,第一次旋转到第二次旋转会很好,因为它在那个时候只在 2D 中移动,但是当你尝试用第二个旋转边界框进行第三次旋转时它赢了没用,因为它将从 2D 变为 3D。
注意 - 如果您认为自己有更好的方法来计算等式或更简单的方法来解释它,请随时添加您自己的答案。
我试图找到最终成为所有三个轴旋转中旋转形状的边界框的
vector Size = <10,1,0.5>; vector Deg = <22.5,0,0>
if(Deg.x > 0 && Deg.y == 0 && Deg.z == 0){
Y1 = Cos(Deg.x) * Size.y + Sin(Deg.x) * Size.z;
Z1 = Cos(Deg.x) * Size.z + Sin(Deg.x) * Size.y;}
下面是 y 和 z 旋转,也就是说,如果您决定将度数更改为 <0,22.5,0> 和 <0,0,22.5>。
if(Deg.y > 0 && Deg.x == 0 && Deg.z == 0){
X2 = Cos(Deg.y) * Size.x + Sin(Deg.y) * Size.z;
Z2 = Cos(Deg.y) * Size.z + Sin(Deg.y) * Size.x;}
if(Deg.z > 0 && Deg.x == 0 && Deg.y == 0){
X3 = Cos(Deg.z) * Size.x + Sin(Deg.z) * Size.y;
Y3 = Cos(Deg.z) * Size.y + Sin(Deg.z) * Size.x;}
虽然我迷失的部分是,如果你有两个或三个轴的旋转,我从这里去哪里。如 <22.5,22.5,0> 或 <22.5,22.5.22.5>
是否有包含我可以查看的教程或示例方程式的网站,或者是否有关于我可以做些什么来解决这个问题的任何提示或想法。
编辑:
我确实想补充一点,Nico 的评论有所帮助,因为我要问的是:轴对齐边界框或简称 AABB。
至于 JohanC 关于 22.5 的评论,是的,Deg = Degree。另外,是的,您必须将度数转换为弧度,但我在 Sin 和 Cos 输入的示例中将其作为度数以保持简单。
如果您想知道这个问题有何用处。举个例子,你需要知道 AABB 来帮助方程式,如果你要说调整项目的大小,而它有
经过大量的测试和调试,我找到了自己的解决方案。我将展示和解释我创建的脚本的一小部分,因为功能和选项因编码语言而异。
有关以下示例脚本的一些详细信息。度 = 度数。虽然是的,JohanC 提到的关于弧度的内容是正确的,因为即使是我使用的语言,我也必须使用函数将度数转换为弧度。并非每种语言或计算器都是这样,但为了使其更易于阅读的意图和目的,我确实去掉了多余的部分,同时保持 code/equation 的内容完好无损。同样在这个例子中,我在 Z 轴上旋转它来演示并作为起点。
vector Size = <10,1,0.5>; //Insert your own coding language function
//for splitting the size in half with positive and negative halves.
vector min = <-5,-0.5,-0.25>; vector max = <5,0.5,0.25>;
//You'll need at least 8 points in total to do this correctly.
//I already have 8 points added down below, labeled p1 - p8
vector p1 = <max.x,max.y,max.z>; vector p2 = <max.x,min.y,max.z>;
vector p3 = <max.x,max.y,min.z>; vector p4 = <max.x,min.y,min.z>;
vector p5 = <min.x,max.y,max.z>; vector p6 = <min.x,min.y,max.z>;
vector p7 = <min.x,max.y,min.z>; vector p8 = <min.x,min.y,min.z>;
vector Deg = <0,0,22.5>
//This will give you an idea of how to setup the x,y,z for each point
//equation to make / change to fit the rotations. Plus to make it compact
//I suggest that you use list, a while loop, and etc.
x1 = p1.x * llCos(Deg.z) - p1.y * llSin(Deg.z);
y1 = p1.y * llCos(Deg.z) + p1.x * llSin(Deg.z);
我在上面的示例中保留的很多内容是几个列表、true 和 false 语句、while 循环和其他一些东西。尽管显示它的不那么复杂的部分以及并非每种语言都具有相同的可用功能这一事实保持简单。
虽然一旦你获得了收集到的8个点的所有位置数据,你就可以将每个x,y,z点信息放入自己的列表中。然后 运行 等式(根据每次旋转的需要进行编辑)。之后,从每个轴旋转输出中获取最大值和最小值。然后取最大值并从中减去最小值,因为最小值始终为负数。那里会给你边界框的
我确实想补充一点,Nico 的 link 略有帮助,尽管它的唯一缺陷是“如果”您使用的语言允许矩阵或“如果”您能够创建一个多维数组。如果你能做到,那么使用 Nico 提供的 link 看看是否有帮助。
还有一些 JohanC tips/hints 也提供了帮助。说到这一点,当且仅当您使用 8 点方法时,关于“使用从一个旋转到下一个旋转的矢量输出”的部分才有效。否则,如果您尝试它的边界框大小是一个到下一个,第一次旋转到第二次旋转会很好,因为它在那个时候只在 2D 中移动,但是当你尝试用第二个旋转边界框进行第三次旋转时它赢了没用,因为它将从 2D 变为 3D。
注意 - 如果您认为自己有更好的方法来计算等式或更简单的方法来解释它,请随时添加您自己的答案。