计算横向拉伸物体的比例和位置

时间:2015-05-13 02:34:33

标签: c++ resize geometry transform scaling

我正在尝试通过在3D空间的2D正交视图中使用选择边界框来实现对象拉伸。我试图得到的效果类型就像是一个物体被选择框选中时,可以拉出边和角来改变下面的物体形状。

我的问题是我无法得到正确的数学。

我只能想到实现仅向鼠标伸展的唯一方法是执行两个步骤:

  • 1)将物体缩放到鼠标位置的一半(因为满刻度也会缩放物体的另一侧)
  • 2)翻译对象的后半部分

这会导致将对象缩放到鼠标,同时保持对方边缘“锁定”到位:

enter image description here

问题:

我设法实现了一个非常糟糕的版本,但它只适用于方形形状(上面的gif),或更确切地说,形状的最大宽度/高度/深度都是相同的。否则,会发生这种情况:

enter image description here

详细说明:

我的物体不是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

此块用于LEFT,BOTTOM和BACK面:

float diff1 = difference/objScale;
float scale = (difference-(target-min))/diff1;
float diff2 = diff1*scale;
float diff3 = max-((diff2/2)+objPos);
float position = diff3+objPos;

所以我正在寻找的是一种在给定鼠标坐标的情况下计算物体比例和位置的正确方法。

1 个答案:

答案 0 :(得分:1)

花了我很多时间,但我最终想出来了,

为了计算适当的比例,我不得不将最左边的边乘以加到当前位置的当前比例乘以当前鼠标坐标。最后,所有除以基础宽度或该特定轴上该对象的最极端点之间的差异。

对于位置,我通过将最左边的边缘乘以添加到当前位置的当前比例来做同样的事情,但是然后减去最左边的边缘乘以添加到当前位置的新计算的比例。然后该值将是一个偏移位置,将被添加到当前对象位置。

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;

这适用于任何大小的任何形状,其中的原点都在其中。唯一需要改变的是最小值和最大值,具体取决于使用的边缘。

enter image description here