【发布时间】:2022-01-17 12:12:57
【问题描述】:
【问题讨论】:
标签: 3d game-development godot
【问题讨论】:
标签: 3d game-development godot
我只想生成树。
您确定不想查询形状与您打算放置树木的特定垂直线相交的位置吗?据推测,您可以为此使用 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,因此不知道应用到使用 ArrayMesh 的 MeshInstance 的转换。
哦,但这也不是你问的。你想要“所有坐标和旋转”。好吧,我们可以为每个人脸计算一个法线,它是叉积和归一化:
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。但是请注意,如果y 是0,这将使整个向量成为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)
【讨论】: