[码农亚] 万军之中智取首级之最短距离
00:很长时间没有更新,因为阳历4月到7月初都在加班,大晚上回家,一周7天那种,现在总算阶段告一段落。
01:这次先分享一个小的思考,是我在做项目时候遇到的,浓缩说出来下。
      
02:如图所示,假设左下角是点A(坐标已知),右上为点B(坐标已知),求AB直线上一点C,使得C点到B点的距离为3m,如何求?
       (Unity本身单位计量为1m,不突兀)
03:经过抽象,我们得出下图
      
我们要求的就是C点的坐标
04:首先我脑海蹦出来的就是一个想法:利用二分思想进行数据切割得出。
      
       经过测试,数据可行,然后我就将方法融入到项目中。
05:我的项目要求就是人物在100多个障碍点中快速找到最近的距离目标为3米的某点,然后跑过去。。。
06:经过测试,我发现:效果能达到,但是利用二分思想层层分割,数据量大,效率低下。。。
07:然后就必须选取替代的方法。
       。。。若干分钟后,想到了向量。
08:向量思路:
       A点看作原点的话,C点坐标相当于求取AC向量,图中所示:AB向量等于AC向量加CB向量,因此AC向量等于AB向量减去CB向量
       恰巧有单位向量做衡量尺
09:所以我的相关代码就贴在下面:
[mw_shl_code=csharp,true]using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//求取距离
public class GetCuteDistance : MonoBehaviour {

    public Transform _originPort;
    public Transform _targetPort;
    //临时Temp数据变量
    private Vector3 _vv;
    public  Vector3 _res;
    GameObject _Temp;
        void Start () {
        _vv = _originPort.position;

        }
       
        // Update is called once per frame
        void Update () {
        if (Input.GetKeyDown(KeyCode.P))
        {
            Debug.Log("P按键按下!!!");
            _res = GetCutePort2(3);
        }
        if (Input.GetKeyDown(KeyCode.R))
        {
            Debug.Log("R按键按下!!!");
            if (_Temp ==null)
            {
                _Temp = GameObject.CreatePrimitive(PrimitiveType.Cube);
                _Temp.name = "TempCube";
                _Temp.transform.position = _res;
            }
        }

    }
    public Vector3 GetCutePort(int limitDistance)
    {     
        Vector3 center = (_vv + _targetPort.position) / 2;
        float factDistance = Vector3.Distance(center, _targetPort.position);
        while (factDistance > limitDistance)
        {
            _vv = center;
             center = (_vv + _targetPort.position) / 2;
            factDistance = Vector3.Distance(center, _targetPort.position);
        }
         return  center;
    }
    //现在打算用向量进行拓展
    public Vector3 GetCutePort2(int limitDistance)
    {
        Vector3 direction =  _targetPort.position - _vv;
        direction.Normalize();
        Vector3 center = (_targetPort.transform.position)- (direction * limitDistance);
        return center;
    }

}[/mw_shl_code]

10:其实这个方法就是解决多个敌人找出最近敌人类似的问题来说明的,最近换城市,可能下个更新晚一些。
       以后的分享可能更多的是数学一类的了,预计的是想说如何用Unity结合数据做大数据长条动态图,不过没确定。
11:祝福大家开心快乐,嗯。
       项目地址:
RomanticCute11.zip (1.94 MB)
(下载次数: 10, 2019-7-26 22:09 上传)








  • 沙发 tdnlw
  • 2019-7-27 07:19:25
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标   
  • 板凳 tdnlw
  • 2019-7-27 07:20:25
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标   
引用: tdnlw 发表于 2019-7-27 07:19
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标     ...

我也这么想的 很简单就可以实现
6666666666666666666666666
点B+向量BA/|BA|*3.0f=点B+向量BA.normalize*3.0就是点c,如果你计算过向量BA的长度,就用前面的方法
(这是很基础的东西)
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标
可以可以...
没看明白解法,如果是要得到 A到B 这条线上的 某一个离B点3M远的点,直接用向量BA,从B出发走3米不就是答案了?
或者直接用矩阵也是可以啊
A.v3+3/(V3.distance(A,B))*(B.v3-A.v3)
不知道跟你的哪个效率高点
RE: 炫酷的汽车场景切换效果分享 [修改]
666666666666666666666
生成一个Ray 直接获取......... 你在梦游啊?
1. 不要用除法, 除以2可以写成乘以0.5
2. 距离如果只是做比较的话, 使用平方距离, Vector3.SqrMagnitude的存在意义就在这里
3. 多了解引擎API 不要自己乱捣鼓反而效率低下, 导致加班
Vector3 A = Vector3.zero;
        Vector3 B = Vector3.one * 10f;
        Vector3 C;
        C = Vector3.Lerp(B, A, 3f / Vector3.Distance(A, B));
12下一页