I'm trying to make a representation of a plane that rotates around a hole in a MeshInstance3D
.
So far I've managed to make the circle's hole, but I can't make the plane rotate around the hole. (The hole can't rotate, just the plane)
Here is what I have now:
extends MeshInstance3D
@export var xSize = 20
@export var zSize = 20
@export var update = false
@export var clear_vert_vis = false
var speed = 0.0001
# Called when the node enters the scene tree for the first time.
func _ready():
#generate_terrain(speed : float)
pass # Replace with function body.
func generate_terrain(speed : float):
var a_mesh: ArrayMesh
var surftool = SurfaceTool.new()
var n = FastNoiseLite.new()
n.noise_type = FastNoiseLite.TYPE_PERLIN
n.frequency = 0.1 * speed
surftool.begin(Mesh.PRIMITIVE_TRIANGLES)
for z in range(zSize +1):
for x in range(xSize+1):
var y_variation = cos(speed)
var y = 0 #n.get_noise_2d(x*0.5,z*0.5) * 4* y_variation
var x1 = x -xSize/2
var z1 = z -zSize/2
if inside_circle(xSize/2,x, z, 4):
y = speed * -1
pass
elif around_circle(xSize/2, x, z , 4, 8):
y = n.get_noise_2d(x*0.5,z*0.5) * 4* y_variation
var angle = int(speed) % 90
# x1 and z1 should rotate around center
#x1 = cos(angle)
#z1 = sin(angle)
#rotate(Vector3(0,1,0), angle)
# Place in center 0, 0
# tying to make the rotation, but it is on wrong axis
#var xNew = x1 * cos(speed) - z1 * sin(speed)
#var zNew = x1 * sin(speed) - z1 * cos(speed)
# uv
var uv = Vector2()
uv.x = inverse_lerp(0,xSize, x1)
uv.y = inverse_lerp(0, zSize, z1)
surftool.set_uv(uv)
# vertex
surftool.add_vertex(Vector3(x1,y,z1))
var vert = 0
for z in zSize:
for x in xSize:
surftool.add_index(vert+0)
surftool.add_index(vert+1)
surftool.add_index(vert+xSize+1)
surftool.add_index(vert+xSize+1)
surftool.add_index(vert+1)
surftool.add_index(vert+xSize+2)
vert += 1
vert += 1
surftool.generate_normals()
a_mesh = surftool.commit()
mesh = a_mesh
pass
# return the circle around the plane
func inside_circle(center: float, x: float, z: float, radius : float):
var dx = center - x
var dz = center - z
var distance_squared = dx * dx + dz * dz
return distance_squared <= radius * radius
enter code here
# return a ring around the circle
func around_circle(center: float, x: float, z: float, inerradius: float, radius : float):
var dx = center - x
var dz = center - z
var distance_squared = dx * dx + dz * dz
return distance_squared <= radius * radius and distance_squared > inerradius * inerradius
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
speed *= 1.01
generate_terrain(speed)
if clear_vert_vis:
for i in get_children():
i.free()
pass
How can I make this plane rotate around the hole, without the hole rotating?