Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Unity3d中通过了解三角形模型的顶点来定位和缩放三角形模型_Unity3d_3d_Triangulation - Fatal编程技术网

如何在Unity3d中通过了解三角形模型的顶点来定位和缩放三角形模型

如何在Unity3d中通过了解三角形模型的顶点来定位和缩放三角形模型,unity3d,3d,triangulation,Unity3d,3d,Triangulation,我想定位不同的等边三角形模型,在一个统一的三维空间。问题是3个已知的顶点不是等边三角形,其中一些甚至不是等腰的,所以我需要包装我的模型,使其角点与给定的顶点相匹配。 我想建模那些彼此不同的三角形,这就是为什么要使用预先创建的模型 目前,我执行以下计算以将三角形定位并缩放到等腰三角形上: 给定3个顶点的中点 Vector3中点=(点[0]+点[1]+点[2])/3 距中点距离 pointdistance[i]=Vector3.距离(点[i],中点) 最近的点是我将旋转三角形的点,因此我知道三角形的

我想定位不同的等边三角形模型,在一个统一的三维空间。问题是3个已知的顶点不是等边三角形,其中一些甚至不是等腰的,所以我需要包装我的模型,使其角点与给定的顶点相匹配。 我想建模那些彼此不同的三角形,这就是为什么要使用预先创建的模型

目前,我执行以下计算以将三角形定位并缩放到等腰三角形上:

  • 给定3个顶点的中点
    Vector3中点=(点[0]+点[1]+点[2])/3
  • 距中点距离
    pointdistance[i]=Vector3.距离(点[i],中点)
  • 最近的点是我将旋转三角形的点,因此我知道三角形的高度(y轴),假设角点是
    点[0]
    so
    浮动高度=矢量3.距离(点[0],中点)
  • (我肯定这一步对于非等腰三角形是错误的)我通过确定外接圆半径来计算它的宽度,并借助剩余的点
    float width=(float)(向量3.距离(点[1],点[2])*Math.Sqrt(3)/3)
  • 将比例应用于模型
    float scale=新矢量3(高度、宽度、1)
  • 我计算这3个点的法线
    normalVec
    ,以获得正确的x和y方向,这很好,所以我认为我不需要更改它
  • 实例化三角形
    this.Triangle=(游戏对象)实例化(standardTriangleModel,middlepoint,Quaternion.LookRotation(normalVec,points[0])
  • 在三角形不再是等腰三角形之前,结果看起来相当不错

    (蓝线=中点到最近点,绿线=给定顶点之间的连接)


    那么,有人知道我如何定位和调整三角形模型以匹配这些点吗?

    没有代码,因为我现在手头没有unity。这个答案基于Unity问答网站

    从高度和宽度为1的直角三角形的游戏对象开始:

    然后,对于三角形ABC,将直角三角形游戏对象的X刻度(我们可以称之为
    mainObject
    )设置为AB的长度,并将Y刻度设置为C和穿过AB的直线之间的最短距离(从基准AB测量的三角形高度)

    考虑角CAB=θ

    然后,将
    mainObject
    放入名为
    Outer1
    的父游戏对象中。比例
    Outer1
    ,Y=sqrt(2)/sin(90-θ),X=sqrt(2)

    然后,将Outer1放入名为
    Outer2
    的父游戏对象中。将
    Outer2
    围绕
    main对象旋转。将
    向前旋转(θ-90)(应为90-θ的顺时针旋转)

    然后,将Outer2放入名为
    Outer3
    的父游戏对象中。标度
    Outer3
    ,Y=sin((90-θ)/2),X=cos((90-θ)/2


    此时,
    mainObject
    应剪切并缩放成正确的形状。您只需定位并旋转
    Outer3
    ,使
    main对象的(预剪切)直角角位于A,
    main对象。右
    点从A到B,
    main对象。向前
    点垂直于三角形。

    没有代码,因为我现在手头没有统一体。这个答案基于Unity问答网站

    从高度和宽度为1的直角三角形的游戏对象开始:

    然后,对于三角形ABC,将直角三角形游戏对象的X刻度(我们可以称之为
    mainObject
    )设置为AB的长度,并将Y刻度设置为C和穿过AB的直线之间的最短距离(从基准AB测量的三角形高度)

    考虑角CAB=θ

    然后,将
    mainObject
    放入名为
    Outer1
    的父游戏对象中。比例
    Outer1
    ,Y=sqrt(2)/sin(90-θ),X=sqrt(2)

    然后,将Outer1放入名为
    Outer2
    的父游戏对象中。将
    Outer2
    围绕
    main对象旋转。将
    向前旋转(θ-90)(应为90-θ的顺时针旋转)

    然后,将Outer2放入名为
    Outer3
    的父游戏对象中。标度
    Outer3
    ,Y=sin((90-θ)/2),X=cos((90-θ)/2


    此时,
    mainObject
    应剪切并缩放成正确的形状。您只需定位并旋转
    Outer3
    ,使
    mainObject
    的(预剪切)直角角位于A,
    mainObject。right
    从A指向B,和
    main object.forward
    点垂直于三角形。

    这听起来像是一个三角形,你不能只通过修改一次等边三角形的比例就将其变成非等边三角形。您至少还需要应用剪切变换。您可以使用具有不同旋转和缩放的嵌套变换来完成此操作。。。你能解释一下你想要完成什么,以便回答者能提供更多有用的建议吗?为了澄清,我想把模块化三角形模型放在一个icosphere(测地多面体)上icosphere的三角形有不同的形状。你为什么不把它做成你需要的形状?我可以把网格改成预制的或fbx模型吗?@nimmand你不必烘焙修改,没关系,你只要在Awake()上应用它,我就把它捕捉进去,对于大多数应用来说这都很好(修改共享网格-更改将传播)这听起来像是一个例子,你不能只通过修改等边三角形的比例一次就将其变成非等边三角形。你至少还需要应用剪切变换。你可以使用具有不同旋转和比例的嵌套变换来实现这一点……你能解释一下你想要实现什么吗