[Godot] 3D拾取

CollisionObject3D文档
Camera3D文档

CollisionObject3D有个信号_input_event,可以用于处理3D拾取。

Camera3D也有project_position用于将屏幕空间坐标投影到3D空间。

gdscript 复制代码
extends Node3D

#是否处于选中状态
var selected : bool = false
#摄像机的前向量
var front : Vector3 = Vector3(0.0, 0.0, -1.0)
#待拾取的对象
@onready var a : CollisionObject3D = $a
#标记,表示在3D物体上的位置
@onready var mark : MeshInstance3D = $mark

func _on_a_mouse_entered() -> void:
	print("entered")
	mark.visible = true

func _on_a_mouse_exited() -> void:
	print("exited")
	mark.visible = false

func _on_a_input_event(camera: Node, event: InputEvent, position: Vector3, normal: Vector3, shape_idx: int) -> void:
	var str = \
	"camera: " + str(camera) + "\n" + \
	"event: " + str(event) + "\n" + \
	"position: " + str(position) + "\n" + \
	"normal: " + str(normal) + "\n" + \
	"shape_idx: " + str(shape_idx) + "\n" + \
	"a.position: " + str(a.position)
	$mark.position = position
	$label.text = str
	
	if event is InputEventMouseButton:
		if event.button_index == MOUSE_BUTTON_LEFT:
			if event.pressed:
				selected = true
			else:
				selected = false
	
	elif event is InputEventMouseMotion:
		if selected:
			var c : Camera3D = camera as Camera3D
			#由相机指向物体的向量
			var dir : Vector3 = a.position - c.position
			#dir投影到front上所得的长度
			var dis : float = front.dot(dir)
			#将位置投影到3D空间
			a.position = c.project_position(event.position, dis)
相关推荐
沙振宇1 天前
【Web】使用Vue3+PlayCanvas开发3D游戏(九)纹理视觉效果
前端·游戏·3d·纹理
Zldaisy3d1 天前
日本东北大、武汉理工、上海交大 l 3D打印重塑下一代锂电池制造综述
3d·制造
kyle~1 天前
FANUC机器人与3D相机网络连接冲突错误排查报告(Linux默认路由冲突)
数码相机·3d·机器人
CG_MAGIC1 天前
Blender角色设计ChouChou
3d·blender·贴图·效果图·建模教程
bcbobo21cn1 天前
Web 3D 正方体贴图
前端·3d·贴图·mesh
风酥糖2 天前
Godot游戏练习01-第27节-升级选项选择生效
游戏·游戏引擎·godot
军军君012 天前
Three.js基础功能学习十五:智能黑板实现实例二
开发语言·前端·javascript·vue.js·3d·threejs·三维
郝学胜-神的一滴2 天前
[简化版 GAMES 101] 计算机图形学 04:二维变换上
c++·算法·unity·godot·图形渲染·unreal engine·cesium
半步成诗!2 天前
【RJ 45连接器】RJ45 网络连接器 3D 模型 3 零件装配体 SolidWorks 源文件 含 STEP/IGS 通用格式
网络·笔记·3d·硬件工程
syncon123 天前
基于手机液晶相变的集成电路内部短路失效定位及液晶线路激光修复原理
科技·3d·制造