LargeScreen/traiectory.gd
2025-01-13 14:39:58 +08:00

65 lines
2.1 KiB
GDScript

extends MeshInstance3D
func add_ptah(arr,node,mate = preload("res://line_2.tres")):
var vertices = PackedVector3Array()
for index in arr.size():
if index >= arr.size() -2: break
var a_post:Vector3 = arr[index]
var b_post:Vector3 = arr[index + 1]
var c_post:Vector3 = arr[index + 2]
var a1 = calculate_A2_position(Vector2(a_post.x,a_post.z),Vector2(b_post.x,b_post.z),1)
vertices.push_back(a_post )
vertices.push_back(Vector3(a1.x,a_post.y,a1.y))
vertices.push_back(b_post )
var b1 = calculate_A2_position(Vector2(b_post.x,b_post.z),Vector2(c_post.x,c_post.z),1)
vertices.push_back(Vector3(b1.x,b_post.y,b1.y))
vertices.push_back(b_post)
vertices.push_back(Vector3(a1.x,a_post.y,a1.y))
var a2 = calculate_A2_position(Vector2(a_post.x,a_post.z),Vector2(b_post.x,b_post.z),1,false)
vertices.push_back(a_post )
vertices.push_back(Vector3(a2.x,a_post.y,a2.y))
vertices.push_back(b_post )
var b2 = calculate_A2_position(Vector2(b_post.x,b_post.z),Vector2(c_post.x,c_post.z),1,false)
vertices.push_back(Vector3(b2.x,b_post.y,b2.y))
vertices.push_back(b_post)
vertices.push_back(Vector3(a2.x,a_post.y,a2.y))
# 初始化 ArrayMesh。
var arr_mesh = ArrayMesh.new()
var arrays = []
arrays.resize(Mesh.ARRAY_MAX)
arrays[Mesh.ARRAY_VERTEX] = vertices
# 创建 Mesh。
arr_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
node.mesh = arr_mesh
node.mesh.surface_set_material(0,mate)
pass
func calculate_A2_position(A1: Vector2, B1: Vector2, distance_to_A2: float,r = true) -> Vector2:
var m_l2 = (B1.y - A1.y) / (B1.x - A1.x) # 计算m_l2 (B1 和 A1之间的斜率)
var m_l1 = -1 / m_l2 # 计算m_l1 (垂直线的斜率)
var dx = distance_to_A2 / sqrt(1 + pow(m_l1, 2)) # 计算 dx 和 dy
var dy = m_l1 * dx
# 计算 A2 的位置 (有两个可能的解)
var A2_1 = Vector2(A1.x + dx, A1.y + dy)
var A2_2 = Vector2(A1.x - dx, A1.y - dy)
var direction_to_b1 = (B1 - A1).normalized()
if r:
if direction_to_b1.cross(A2_1 - A1) > 0:
return A2_1
else:
return A2_2
else:
if direction_to_b1.cross(A2_1 - A1) < 0:
return A2_1
else:
return A2_2