栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity 开发:模型自动贴合配准

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity 开发:模型自动贴合配准

C#写的一个简单的自动贴合脚本,可以实现物体移动后,将物体放回原位的功能。

前言

      本文采用标志位进行物体位置判断,设置自动贴合距离。两物体处于自动贴合距离内时,根据物体标志位的三维坐标和欧拉角,进行平移和旋转操作,实现贴合操作。


一、设置物体标志位

Target:绘制一个蓝色四边形,表示贴合平面位置;一条红色射线,表示贴合平面的欧拉角。

在需要自动贴合的两物体下创建空物体,命名为Target,并将标志位脚本挂载在空物体上。

Vector2 halfSize = Size * 0.5f;
Gizmos.color = Color.red;
float lineLength = Mathf.Min(Size.x, Size.y);
Gizmos.DrawLine(transform.position, transform.position + transform.forward * lineLength);

Gizmos.color = Color.blue;
Vector3 topLeft = transform.position - (transform.right * halfSize.x) + (transform.up * Size.y) / 2;
Vector3 topRight = transform.position + (transform.right * halfSize.x) + (transform.up * Size.y) / 2;

Vector3 bottomLeft = transform.position - (transform.right * halfSize.x) - (transform.up * Size.y) / 2;
Vector3 bottomRight = transform.position + (transform.right * halfSize.x) - (transform.up * Size.y) / 2;

Gizmos.DrawLine(topLeft, topRight);
Gizmos.DrawLine(topRight, bottomRight);
Gizmos.DrawLine(bottomRight, bottomLeft);
Gizmos.DrawLine(bottomLeft, topLeft);

二、自动贴合操作

1.贴合操作脚本

设置两个Transform变量接收两物体的位置信息

Transform m_door;
Transform T_door;

void Start()
	{
        m_door = this.transform.Find("Target");
		if (m_door == null)
		{
			Debug.LogError("本地对象未找到位置标志");
		}

		T_door = m_Target.Find("Target");
		if (T_door  == null)
		{
			Debug.LogError("目标对象未找到位置标志");
		}

	}

判断两物体的位置是否小于设置距离

public bool IsClose()
	{
		if (m_door != null && T_door != null)
		{
			if (Vector3.Distance(m_door.position, T_door.position) <= Distance)
			{
				return true;
			}
		}
		return false;
	}

贴合物体计算移动距离,进行位置移动,移动脚本挂载的父物体(模型)

public void MoveTo()
	{
		
		Vector3 moveVector = T_door.position - m_door.position;
		m_door.parent.Translate(moveVector, Space.World);
	}

贴合物体计算欧拉角,进行旋转

public void RotateThis1()
	{
		Vector3 RotateAix = Vector3.Cross(m_door.forward, T_door.forward);
		float angle = Vector3.Angle(m_door.forward, T_door.forward) + 180;
		m_door.parent.Rotate(RotateAix, angle, Space.World);

		float Anle = Vector3.Angle(T_door.up, m_door.up);
		Debug.Log(Anle);
		m_door.parent.Rotate(T_door.forward, Anle, Space.World);

	}

2.Unity中脚本挂载

在需要自动贴合的两物体下创建空物体,用于挂载标志位脚本。

注:空物体命名为Target,需与脚本内一致,否则获取不到位置信息

 

Size设置标志位显示大小,此处显示非必要,可以不显示。

 

 两物体有一个为移动物体(位置变动去贴合另一个物体),A为移动物体。将自动贴合脚本挂载在移动物体A上,在Target初选择B物体,Distance设置贴合距离。

 

运行后,两物体标志位面贴近到Distance以内,自动贴合,并可以分离。


 

 

总结

C#写的一个简单的自动贴合脚本,可以实现物体移动后,将物体放回原位的功能。标志位可以自由移动,放置在任意位置和角度。完整代码请看主页。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901115.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号