extends Node3D @export var target: MeshInstance3D @export var markdown: TextureRect @export var markleft: TextureRect @export var markright: TextureRect @export var message: Label func _ready(): pass func _process(delta): var cam = get_viewport().get_camera_3d() if cam == null: printerr("Not found Camera3D") return var cam_ang = Input.get_axis("ui_left", "ui_right") * (120.0 * delta) cam.rotate_y(deg_to_rad(cam_ang)) var is_behind = cam.is_position_behind(target.global_position) var in_frustum = cam.is_position_in_frustum(target.global_position) var msg = "" msg += "behind: %s" % ("true" if is_behind else "false") msg += "\nin frustum: %s" % ("true" if in_frustum else "false") message.text = msg var viewport_size = get_viewport().get_visible_rect().size var screen_pos = cam.unproject_position(target.global_position) var tw = markdown.texture.get_width() / 2 if not is_behind and (screen_pos.x > tw and screen_pos.x < (viewport_size.x - tw)): markleft.hide() markright.hide() markdown.show() markdown.global_position.x = screen_pos.x - tw #markicon.global_position.y = screen_pos.y - (markicon.texture.get_height()) else: var camvec: Vector3 = -cam.global_transform.basis.z var tgtvec: Vector3 = (target.global_position - cam.global_position) var d = Vector2(camvec.x, camvec.z).cross(Vector2(tgtvec.x, tgtvec.z)) if d > 0: markleft.hide() markright.show() elif d < 0: markleft.show() markright.hide() else: markleft.hide() markright.hide() markdown.hide()