码农亚 万军之中智取首级之最短距离

19
回复
944
查看
打印 上一主题 下一主题
[ 复制链接 ]
排名
2714
昨日变化

13

主题

134

帖子

1231

积分

Rank: 9Rank: 9Rank: 9

UID
251813
好友
5
蛮牛币
2111
威望
0
注册时间
2017-10-31
在线时间
529 小时
最后登录
2019-8-26

专栏作家活力之星

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
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:所以我的相关代码就贴在下面:
[C#] 纯文本查看 复制代码
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;
    }

}


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







4四处流浪
340/500
排名
9112
昨日变化

0

主题

26

帖子

340

积分

Rank: 4

UID
68400
好友
0
蛮牛币
709
威望
0
注册时间
2015-1-14
在线时间
186 小时
最后登录
2019-8-26
沙发
2019-7-27 07:19:25 只看该作者
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标   

点评

和我想的一样  发表于 2019-7-27 12:05
4四处流浪
340/500
排名
9112
昨日变化

0

主题

26

帖子

340

积分

Rank: 4

UID
68400
好友
0
蛮牛币
709
威望
0
注册时间
2015-1-14
在线时间
186 小时
最后登录
2019-8-26
板凳
2019-7-27 07:20:25 只看该作者
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标   
6蛮牛粉丝
1046/1500
排名
2816
昨日变化

5

主题

140

帖子

1046

积分

Rank: 6Rank: 6Rank: 6

UID
116481
好友
0
蛮牛币
1268
威望
0
注册时间
2015-8-3
在线时间
381 小时
最后登录
2019-8-24
地板
2019-7-27 09:34:26 只看该作者
tdnlw 发表于 2019-7-27 07:19
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标     ...

我也这么想的 很简单就可以实现
7日久生情
2139/5000
排名
4092
昨日变化

0

主题

1412

帖子

2139

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蛮牛币
1939
威望
0
注册时间
2017-11-16
在线时间
365 小时
最后登录
2019-8-25
5#
2019-7-27 09:41:34 只看该作者
6666666666666666666666666
3偶尔光临
205/300
排名
31432
昨日变化

1

主题

49

帖子

205

积分

Rank: 3Rank: 3Rank: 3

UID
239634
好友
0
蛮牛币
186
威望
0
注册时间
2017-8-24
在线时间
145 小时
最后登录
2019-8-24
6#
2019-7-27 10:22:52 只看该作者
点B+向量BA/|BA|*3.0f=点B+向量BA.normalize*3.0就是点c,如果你计算过向量BA的长度,就用前面的方法
(这是很基础的东西)
7日久生情
1872/5000
排名
1989
昨日变化

6

主题

565

帖子

1872

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
54335
好友
3
蛮牛币
5439
威望
0
注册时间
2014-11-9
在线时间
619 小时
最后登录
2019-8-24
7#
2019-7-27 11:12:22 只看该作者
首先用点 A-B 得到向量AB, 然后单位化向量AB并乘以3,  最后再加上B点即可得到C点的坐标
5熟悉之中
789/1000
排名
10706
昨日变化

0

主题

529

帖子

789

积分

Rank: 5Rank: 5

UID
301976
好友
1
蛮牛币
1179
威望
0
注册时间
2018-10-31
在线时间
162 小时
最后登录
2019-8-26
8#
2019-7-27 14:36:31 只看该作者
可以可以...
7日久生情
4379/5000
排名
401
昨日变化

144

主题

711

帖子

4379

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
7831
好友
3
蛮牛币
7806
威望
0
注册时间
2013-11-12
在线时间
1520 小时
最后登录
2019-8-25

活力之星

9#
2019-7-28 10:12:56 只看该作者
没看明白解法,如果是要得到 A到B 这条线上的 某一个离B点3M远的点,直接用向量BA,从B出发走3米不就是答案了?
或者直接用矩阵也是可以啊
排名
188
昨日变化

40

主题

926

帖子

4967

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
6108
好友
21
蛮牛币
6192
威望
0
注册时间
2013-10-22
在线时间
1687 小时
最后登录
2019-8-23

七夕浪漫情人

QQ
10#
2019-7-28 14:57:11 只看该作者
A.v3+3/(V3.distance(A,B))*(B.v3-A.v3)
不知道跟你的哪个效率高点
7日久生情
2139/5000
排名
4092
昨日变化

0

主题

1412

帖子

2139

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蛮牛币
1939
威望
0
注册时间
2017-11-16
在线时间
365 小时
最后登录
2019-8-25
11#
2019-7-29 08:41:57 只看该作者
RE: 炫酷的汽车场景切换效果分享 [修改]
4四处流浪
430/500
排名
26985
昨日变化

0

主题

167

帖子

430

积分

Rank: 4

UID
45969
好友
0
蛮牛币
302
威望
0
注册时间
2014-9-21
在线时间
249 小时
最后登录
2019-8-23
12#
2019-7-29 09:40:14 只看该作者
666666666666666666666
5熟悉之中
806/1000
排名
4110
昨日变化

1

主题

273

帖子

806

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
990
威望
0
注册时间
2017-9-21
在线时间
172 小时
最后登录
2019-8-26
13#
2019-7-29 09:47:08 只看该作者
生成一个Ray 直接获取......... 你在梦游啊?
5熟悉之中
806/1000
排名
4110
昨日变化

1

主题

273

帖子

806

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
990
威望
0
注册时间
2017-9-21
在线时间
172 小时
最后登录
2019-8-26
14#
2019-7-29 09:52:50 只看该作者
1. 不要用除法, 除以2可以写成乘以0.5
2. 距离如果只是做比较的话, 使用平方距离, Vector3.SqrMagnitude的存在意义就在这里
3. 多了解引擎API 不要自己乱捣鼓反而效率低下, 导致加班
5熟悉之中
665/1000
排名
4751
昨日变化

1

主题

68

帖子

665

积分

Rank: 5Rank: 5

UID
201386
好友
0
蛮牛币
323
威望
0
注册时间
2017-1-12
在线时间
288 小时
最后登录
2019-8-26
15#
2019-7-29 16:30:45 只看该作者
Vector3 A = Vector3.zero;
        Vector3 B = Vector3.one * 10f;
        Vector3 C;
        C = Vector3.Lerp(B, A, 3f / Vector3.Distance(A, B));
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则