gpt4 book ai didi

c++ - 计算横向拉伸(stretch)对象的比例和位置

转载 作者:行者123 更新时间:2023-11-30 05:43:27 25 4
gpt4 key购买 nike

我正在尝试在 3D 空间的 2D 正交 View 中通过使用选择边界框来实现对象拉伸(stretch)。我想要获得的效果类型就像一个对象被一个选择框包围,并且可以拉动边和角以改变底层对象的形状。

我的问题是我无法正确计算。

我能想到的实现仅向鼠标拉伸(stretch)的唯一方法是执行 2 个步骤:

  • 1) 将对象缩放到鼠标位置的一半(因为全比例也会缩放对象的另一侧)
  • 2) 翻译对象的后半部分

这应该导致对象朝向鼠标缩放,同时保持相对边缘“锁定”在适当位置:

enter image description here

问题:

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

enter image description here

详情:

我的对象不是 2D 的,它们是 3D 的,但显示在 2D 正交 View 上。它们的左下边缘没有原点,它们的原点可以在其中的任何位置,并且可以是任何网格。

以下是我尝试根据鼠标坐标计算比例和位置的方法。此 block 用于 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

这个 block 用于 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;

因此,我正在寻找一种正确的方法来计算给定鼠标坐标的对象的比例和位置。

最佳答案

我花了很多时间,但我终于弄明白了,

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

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

float scale = (target-((baseMin*objScale)+objPos))/baseDifference;
float position = (((baseMin*objScale)+objPos)-((baseMin*scale)+objPos))+objPos;

例如,如果对象是一个立方体,并且要拉伸(stretch)立方体的右侧,假设从 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

关于c++ - 计算横向拉伸(stretch)对象的比例和位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30204686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com