放置类游戏,使用非射线方式求物体在平面上的放置点

1、描述

	放置类游戏,使用非射线方式求物体在平面上的放置点。

项目地址 https://gitee.com/gsjengineer/drop-game.git

2、示例

demo

3、代码

public class DropGame : MonoBehaviour
{
    public Transform ground;

    public Transform target;

    // Update is called once per frame
    void Update()
    {
        Vector3 camDir = Camera.main.ScreenPointToRay(Input.mousePosition).direction.normalized;

        Vector3 groundNormal = ground.up;

        Vector3 cam2GroundDir = ground.transform.position - Camera.main.transform.position;

        float len = (cam2GroundDir.x * groundNormal.x + cam2GroundDir.y * groundNormal.y +
                     cam2GroundDir.z * groundNormal.z) / (camDir.x * groundNormal.x + camDir.y * groundNormal.y +
                                                          camDir.z * groundNormal.z);

        Vector3 targetPos = Camera.main.transform.position + camDir * len+new Vector3(0,0.5f,0);

        target.transform.position = targetPos;
    }
}

4、原理

在这里插入图片描述

公式1 : 目标点位置 p1 = p2 + dir1*长度len

dir1: 方向已知(Camera.main.ScreenPointToRay(Input.mousePosition).direction.normalized;)
长度未知 假设长度为len1
dir2: 方向已知 长度已知 (ground.transform.position - Camera.main.transform.position;)
dir3: 方向已知 长度未知 假设长度为len3 ( ground.up)

根据向量公式 dot( dir1len1,dir3len3) == dot(dir2,dir3len3)
其中dot 为向量点成操作。
装换为数学公式得:
len1
len3*(dir1.xdir3.x+dir1.ydir3.y+dir1.zdir3.z)=
len3
(dir2.xdir3.x+dir2.ydir3.y+dir2.z*dir3.z)

len1=(dir2.xdir3.x+dir2.ydir3.y+dir2.zdir3.z)/(dir1.xdir3.x+dir1.ydir3.y+dir1.zdir3.z)

len1等号右边全部已知,带入公式1 即可求得目标点位置。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值