【问题标题】:How to get coordinates of polygon (convex shape or plane) in godot如何在godot中获取多边形(凸形或平面)的坐标
【发布时间】:2022-01-17 12:12:57
【问题描述】:

我有一个平面和碰撞形状(凸多边形)

that

如您所见,我的平面和碰撞形状具有粗糙度。我需要获取每个多边形的所有坐标和旋转。

我只想生成树。

【问题讨论】:

    标签: 3d game-development godot


    【解决方案1】:

    我只想生成树。

    您确定不想查询形状与您打算放置树木的特定垂直线相交的位置吗?据推测,您可以为此使用 raycast。


    无论如何,这不是你问的。你想要所有的坐标。

    大概你的MeshInstance 有一个ArrayMesh(我在这里描述的不适用于原始网格),我们可以在这样的变量中获取它:

    var plane:MeshInstance = $Plane
    var mesh:ArrayMesh = plane.mesh
    

    然后您将创建一个MeshDataTool 并从ArrayMesh 填充它:

    var mdt := MeshDataTool.new()
    mdt.create_from_surface(mesh, 0) # surface 0 of the mesh
    

    然后你可以遍历顶点:

    for vertex_index in range(mdt.get_vertex_count()):
        var vertex:Vector3 = mdt.get_vertex(vertex_index)
        print(vertex)
    

    然而,大概你对面部感兴趣,所以让我们迭代面部:

    for face_index in range(mdt.get_face_count()):
        var A := mdt.get_vertex(mdt.get_face_vertex(face_index, 0))
        var B := mdt.get_vertex(mdt.get_face_vertex(face_index, 1))
        var C := mdt.get_vertex(mdt.get_face_vertex(face_index, 2))
        print(A, ", ", B, ", ", C)
    

    请注意,您获得的是模型空间中的坐标。它们取自 ArrayMesh,因此不知道应用到使用 ArrayMeshMeshInstance 的转换。


    哦,但这也不是你问的。你想要“所有坐标和旋转”。好吧,我们可以为每个人脸计算一个法线,它是叉积和归一化:

    for face_index in range(mdt.get_face_count()):
        var A := mdt.get_vertex(mdt.get_face_vertex(face_index, 0))
        var B := mdt.get_vertex(mdt.get_face_vertex(face_index, 1))
        var C := mdt.get_vertex(mdt.get_face_vertex(face_index, 2))
        var normal := (B - A).cross(C - A).normalized()
        print (normal)
    

    除了,这可能是颠倒的。我不知道。 您需要(B - A).cross(C - A)(C - A).cross(B - A) 吗? 如果我不在乎,但我知道正常情况应该是积极的y,我们可以快速解决此问题:

    normal *= sign(normal.y)
    

    这可确保y 始终大于或等于0。但是请注意,如果y0,这将使整个向量成为0


    现在我们有了一个法线,我们可以计算出旋转。首先我们需要知道我们需要围绕哪个轴旋转未旋转的法线(我将其设为Vector3.UP)以获得法线:

    var axis = normal.cross(Vector3.UP).normalize()
    

    我们还需要角度:

    var angle = Vector3.UP.signed_angle_to(normal, axis)
    

    然后您可以创建一个表示旋转的变换:

    var transform = Transform.IDENTITY.rotated(axis, angle)
    

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 2015-02-16
      • 1970-01-01
      • 2011-04-19
      • 2011-07-28
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多