我一直在使用X轴和Z轴上的位置和尺寸定义一个平面,然后在该平面内获得一个随机位置,以便使字符在其中随机移动。
到目前为止,我不需要改变方向,所以在平面内获得一个随机的位置是相当简单的。
但是现在我需要对平面(在Y轴)进行评级,以适应地形,我想知道如何在旋转的平面内持续获得随机位置?
非常感谢
如果你只是绕着Y轴旋转,那么你还是在原来的平面边界内得到一个随机的位置,然后用二维旋转公式进行相应的旋转。
它的意思是,你把你的Vector3乘以一个 旋转矩阵或者你只是应用fomula。因此,假设你已经生成了随机的Vector3位置(在我的代码中称为pos),并且你想应用theta的旋转,你的代码可以是 。
Vector3 newPosition = new Vector3(pos.x * Math.cos(theta) - pos.z * Math.sin(theta), pos.y, pos.x * Math.sin(theta) + pos.z * Math.cos(theta));
我还没有测试,但它应该工作。
意识到我需要的是了解如何围绕另一个点旋转一个点,这个帖子帮助了很多实现答案。让一个点绕着另一个点旋转
以下是解决方案,如果有人感兴趣的话:假设我有一个由中心位置组成的平面,以及X和Z的大小,我在其中生成一个随机位置。
float randomX = Random.Range(centerPos.position.x - sizeHalfX, cCenterPos.position.x + sizeHalfX);
float randomZ = Random.Range(centerPos.position.z - sizeHalfZ, centerPos.position.z + sizeHalfZ);
Vector3 randPos = new Vector3(randomX, centerPos.position.y, randomZ);
现在我在一个平面内有一个随机的位置,它在Y轴上没有旋转。所以一旦我们有了Y轴的旋转(假设是度数),我们就可以把它应用到随机位置上,这样随机位置就会落在旋转的平面内。
float angleInRadians = -(rotation * (float)(Math.PI / 180.0d));
float cosTheta = (float)Math.Cos(angleInRadians);
float sinTheta = (float)Math.Sin(angleInRadians);
float posX = (cosTheta * (randPos.x - centerPos.position.x) - sinTheta * (randPos.z - centerPos.position.z) + centerPos.position.x);
float posZ = (sinTheta * (randPos.x - centerPos.position.x) + cosTheta * (randPos.z - centerPos.position.z) + centerPos.position.z);
Vector3 finalPos = new Vector3(posX, centerPos.position.y, posZ);
请注意 "centerPos "是指平面的中心位置。