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 为向量点成操作。
装换为数学公式得:
len1len3*(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 即可求得目标点位置。