首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity3D检查点是在向量的左侧还是右侧

Unity3D检查点是在向量的左侧还是右侧
EN

Stack Overflow用户
提问于 2021-01-19 23:27:10
回答 2查看 645关注 0票数 2

我正在做一个游戏,它有一个跟随样条的目标点。对于我正在进行的转向目标的人工智能,我需要知道目标是在车辆前面的左边还是右边。我该如何完成这件事。(我不需要特定的数字,只需要一个函数返回的布尔值就可以了)。Bellow在某种程度上是一种可视化。

由于这是车辆的人工智能,车辆的旋转可以是任何旋转或任何位置,所以正坐标和负坐标不会真正起作用。如果你们知道如何实现这一点,我将非常感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-20 00:44:30

选项1:使用cross product

代码语言:javascript
复制
Vector3 delta = (targetPoint - vehiclePosition).normalized;
Vector3 cross = Vector3.Cross(delta, vehicleForward);

if (cross == Vector3.zero) {
    // Target is straight ahead
} else if (cross.y > 0) {
    // Target is to the right
} else {
    // Target is to the left
}

这样做的一个主要好处是,叉积的结果是您需要旋转才能到达目标的轴!然后,您可以使用此命令进行旋转:

代码语言:javascript
复制
float angle = Vector3.AngleBetween(vehicleForward, delta);
angle = Mathf.Min(angle, maxTurnSpeed);
transform.Rotate(angle * Time.deltaTime, cross);

如果要限制Y轴/地平面的旋转,可能需要将"delta“和"vehicleForward”的Y值设置为零。

选项2:使用车辆的变换将点变换到局部空间。

代码语言:javascript
复制
Vector3 localPos = vehicle.transform.InverseTransformPoint(targetPoint);

if (localPos.x > 0) {
    // Target is to the left
} else if (localPos.x < 0) {
    // Target is to the right
} else if (localPos.z > 0) {
    // Target is in front
} else {
    // Target is behind
} 
票数 3
EN

Stack Overflow用户

发布于 2021-01-20 03:12:47

谢谢,我只是忘了在我的问题中添加一些代码。事实证明,我错误地使用了Vector3.Cross函数,因为没有为该函数中的参数输入正确的值。谢谢大家和Kalle Halvarsson认识到我的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65794490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档