计算横向拉伸对象的比例和位置
Calculating scale and position for stretching an object sideways
我正在尝试通过使用选择边界框在 3D 的 2D 正交视图中实现对象拉伸 space。我想要获得的效果类型就像一个对象被一个选择框包围,并且可以拉动边和角以改变底层对象的形状。
我的问题是我无法正确计算。
我能想到的实现仅向鼠标拉伸的唯一方法是执行 2 个步骤:
- 1) 将对象缩放到鼠标位置的一半(因为全比例也会缩放对象的另一侧)
- 2) 翻译对象的后半部分
这应该会导致对象 向 鼠标缩放,同时保持相对边缘 "locked" 的位置:
问题:
我已经设法实现了一个非常糟糕的版本,但它只适用于正方形(上面的 gif),或者更准确地说,最大 width/height/depth 的形状都是一样的。否则会出现这种情况:
详情:
我的对象不是 2D 的,它们是 3D 的,但显示在 2D 正交视图上。它们的左下边缘没有原点,它们的原点可以在其中的任何位置,并且可以是任何网格。
以下是我尝试从鼠标坐标计算比例和位置的方法。
此块用于 RIGHT、TOP 和 FRONT 面孔
//target = mouse position
//objPos = object origin position
//objScale = object's current scale
//min and max = the furthest edges of the mesh, on this axis, scaled
float difference = max - min;
//Get desired scale
float scale = ( target + ( difference/2 ) -objPos ) / (difference/objScale);
//Get desired position
float scalemax = ( target + ( difference/2 ) - objPos) / difference;
float position = ( ( (difference)/2 ) * ( scalemax ) ) + min; // Gets passed back to the selected object
这个块用于左面、底面和背面:
float diff1 = difference/objScale;
float scale = (difference-(target-min))/diff1;
float diff2 = diff1*scale;
float diff3 = max-((diff2/2)+objPos);
float position = diff3+objPos;
所以我正在寻找一种正确的方法来计算给定鼠标坐标的对象的比例和位置。
花了我不少时间,但我最终弄明白了,
为了计算出合适的比例,我不得不将最左边乘以当前位置的当前比例,减去当前鼠标坐标。最后,所有除以基本宽度或该对象在该特定轴上的最极端点之间的差异。
对于位置,我做了同样的事情,将最左边乘以添加到当前位置的当前比例,然后减去最左边乘以添加到当前位置的新计算的比例。然后这个值将是一个偏移位置,将添加到当前对象位置。
float scale = (target-((baseMin*objScale)+objPos))/baseDifference;
float position = (((baseMin*objScale)+objPos)-((baseMin*scale)+objPos))+objPos;
例如,如果对象是一个立方体,并且要拉伸立方体的右侧,假设从 50 个单位一直拉伸到 250 个单位,或者缩放比例增加 3 倍:
base difference = rightmost edge - leftmost edge
base difference = (50) - (-50) = 100;
scale = (250 - ( (-50 * 1) + 0) ) / 100;
scale = (300) / (100) = 3;
position = (( (-50 * 1) + 0 ) - ((-50 * 3) + 0) ) + 0;
position = (-50) - (-150) = 100;
这适用于任何大小的任何形状,原点位于其中的任何位置。唯一需要改变的是最小值和最大值,具体取决于使用的边。
我正在尝试通过使用选择边界框在 3D 的 2D 正交视图中实现对象拉伸 space。我想要获得的效果类型就像一个对象被一个选择框包围,并且可以拉动边和角以改变底层对象的形状。
我的问题是我无法正确计算。
我能想到的实现仅向鼠标拉伸的唯一方法是执行 2 个步骤:
- 1) 将对象缩放到鼠标位置的一半(因为全比例也会缩放对象的另一侧)
- 2) 翻译对象的后半部分
这应该会导致对象 向 鼠标缩放,同时保持相对边缘 "locked" 的位置:
问题:
我已经设法实现了一个非常糟糕的版本,但它只适用于正方形(上面的 gif),或者更准确地说,最大 width/height/depth 的形状都是一样的。否则会出现这种情况:
详情:
我的对象不是 2D 的,它们是 3D 的,但显示在 2D 正交视图上。它们的左下边缘没有原点,它们的原点可以在其中的任何位置,并且可以是任何网格。
以下是我尝试从鼠标坐标计算比例和位置的方法。 此块用于 RIGHT、TOP 和 FRONT 面孔
//target = mouse position
//objPos = object origin position
//objScale = object's current scale
//min and max = the furthest edges of the mesh, on this axis, scaled
float difference = max - min;
//Get desired scale
float scale = ( target + ( difference/2 ) -objPos ) / (difference/objScale);
//Get desired position
float scalemax = ( target + ( difference/2 ) - objPos) / difference;
float position = ( ( (difference)/2 ) * ( scalemax ) ) + min; // Gets passed back to the selected object
这个块用于左面、底面和背面:
float diff1 = difference/objScale;
float scale = (difference-(target-min))/diff1;
float diff2 = diff1*scale;
float diff3 = max-((diff2/2)+objPos);
float position = diff3+objPos;
所以我正在寻找一种正确的方法来计算给定鼠标坐标的对象的比例和位置。
花了我不少时间,但我最终弄明白了,
为了计算出合适的比例,我不得不将最左边乘以当前位置的当前比例,减去当前鼠标坐标。最后,所有除以基本宽度或该对象在该特定轴上的最极端点之间的差异。
对于位置,我做了同样的事情,将最左边乘以添加到当前位置的当前比例,然后减去最左边乘以添加到当前位置的新计算的比例。然后这个值将是一个偏移位置,将添加到当前对象位置。
float scale = (target-((baseMin*objScale)+objPos))/baseDifference;
float position = (((baseMin*objScale)+objPos)-((baseMin*scale)+objPos))+objPos;
例如,如果对象是一个立方体,并且要拉伸立方体的右侧,假设从 50 个单位一直拉伸到 250 个单位,或者缩放比例增加 3 倍:
base difference = rightmost edge - leftmost edge
base difference = (50) - (-50) = 100;
scale = (250 - ( (-50 * 1) + 0) ) / 100;
scale = (300) / (100) = 3;
position = (( (-50 * 1) + 0 ) - ((-50 * 3) + 0) ) + 0;
position = (-50) - (-150) = 100;
这适用于任何大小的任何形状,原点位于其中的任何位置。唯一需要改变的是最小值和最大值,具体取决于使用的边。