找回密碼
 注冊帳號

掃一掃,訪問微社區

碼農亞 萬軍之中智取首級之最短距離

19
回復
861
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
2714
昨日變化

13

主題

134

帖子

1228

積分

Rank: 9Rank: 9Rank: 9

UID
251813
好友
5
蠻牛幣
2119
威望
0
注冊時間
2017-10-31
在線時間
525 小時
最后登錄
2019-8-13

專欄作家活力之星

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

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四處流浪
334/500
排名
9112
昨日變化

0

主題

26

帖子

334

積分

Rank: 4

UID
68400
好友
0
蠻牛幣
682
威望
0
注冊時間
2015-1-14
在線時間
180 小時
最后登錄
2019-8-18
沙發
2019-7-27 07:19:25 只看該作者
首先用點 A-B 得到向量AB, 然后單位化向量AB并乘以3,  最后再加上B點即可得到C點的坐標   

點評

和我想的一樣  發表于 2019-7-27 12:05
回復 支持 2 反對 0

使用道具 舉報

4四處流浪
334/500
排名
9112
昨日變化

0

主題

26

帖子

334

積分

Rank: 4

UID
68400
好友
0
蠻牛幣
682
威望
0
注冊時間
2015-1-14
在線時間
180 小時
最后登錄
2019-8-18
板凳
2019-7-27 07:20:25 只看該作者
首先用點 A-B 得到向量AB, 然后單位化向量AB并乘以3,  最后再加上B點即可得到C點的坐標   
回復 支持 反對

使用道具 舉報

6蠻牛粉絲
1044/1500
排名
2816
昨日變化

5

主題

140

帖子

1044

積分

Rank: 6Rank: 6Rank: 6

UID
116481
好友
0
蠻牛幣
1276
威望
0
注冊時間
2015-8-3
在線時間
379 小時
最后登錄
2019-8-15
地板
2019-7-27 09:34:26 只看該作者
tdnlw 發表于 2019-7-27 07:19
首先用點 A-B 得到向量AB, 然后單位化向量AB并乘以3,  最后再加上B點即可得到C點的坐標     ...

我也這么想的 很簡單就可以實現
回復 支持 反對

使用道具 舉報

7日久生情
2101/5000
排名
4092
昨日變化

0

主題

1379

帖子

2101

積分

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

UID
254705
好友
1
蠻牛幣
1905
威望
0
注冊時間
2017-11-16
在線時間
360 小時
最后登錄
2019-8-18
5#
2019-7-27 09:41:34 只看該作者
6666666666666666666666666
回復 支持 反對

使用道具 舉報

3偶爾光臨
201/300
排名
31432
昨日變化

1

主題

49

帖子

201

積分

Rank: 3Rank: 3Rank: 3

UID
239634
好友
0
蠻牛幣
183
威望
0
注冊時間
2017-8-24
在線時間
141 小時
最后登錄
2019-8-17
6#
2019-7-27 10:22:52 只看該作者
點B+向量BA/|BA|*3.0f=點B+向量BA.normalize*3.0就是點c,如果你計算過向量BA的長度,就用前面的方法
(這是很基礎的東西)
回復 支持 反對

使用道具 舉報

7日久生情
1865/5000
排名
1989
昨日變化

6

主題

564

帖子

1865

積分

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

UID
54335
好友
3
蠻牛幣
5433
威望
0
注冊時間
2014-11-9
在線時間
613 小時
最后登錄
2019-8-16
7#
2019-7-27 11:12:22 只看該作者
首先用點 A-B 得到向量AB, 然后單位化向量AB并乘以3,  最后再加上B點即可得到C點的坐標
回復 支持 反對

使用道具 舉報

5熟悉之中
746/1000
排名
10706
昨日變化

0

主題

491

帖子

746

積分

Rank: 5Rank: 5

UID
301976
好友
1
蠻牛幣
1111
威望
0
注冊時間
2018-10-31
在線時間
157 小時
最后登錄
2019-8-17
8#
2019-7-27 14:36:31 只看該作者
可以可以...
回復

使用道具 舉報

7日久生情
4376/5000
排名
401
昨日變化

144

主題

711

帖子

4376

積分

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

UID
7831
好友
3
蠻牛幣
7721
威望
0
注冊時間
2013-11-12
在線時間
1517 小時
最后登錄
2019-8-16

活力之星

9#
2019-7-28 10:12:56 只看該作者
沒看明白解法,如果是要得到 A到B 這條線上的 某一個離B點3M遠的點,直接用向量BA,從B出發走3米不就是答案了?
或者直接用矩陣也是可以啊
回復 支持 反對

使用道具 舉報

排名
188
昨日變化

40

主題

926

帖子

4962

積分

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

UID
6108
好友
21
蠻牛幣
6149
威望
0
注冊時間
2013-10-22
在線時間
1682 小時
最后登錄
2019-8-16

七夕浪漫情人

QQ
10#
2019-7-28 14:57:11 只看該作者
A.v3+3/(V3.distance(A,B))*(B.v3-A.v3)
不知道跟你的哪個效率高點
回復 支持 反對

使用道具 舉報

7日久生情
2101/5000
排名
4092
昨日變化

0

主題

1379

帖子

2101

積分

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

UID
254705
好友
1
蠻牛幣
1905
威望
0
注冊時間
2017-11-16
在線時間
360 小時
最后登錄
2019-8-18
11#
2019-7-29 08:41:57 只看該作者
RE: 炫酷的汽車場景切換效果分享 [修改]
回復 支持 反對

使用道具 舉報

4四處流浪
429/500
排名
26985
昨日變化

0

主題

167

帖子

429

積分

Rank: 4

UID
45969
好友
0
蠻牛幣
299
威望
0
注冊時間
2014-9-21
在線時間
248 小時
最后登錄
2019-8-17
12#
2019-7-29 09:40:14 只看該作者
666666666666666666666
回復 支持 反對

使用道具 舉報

5熟悉之中
796/1000
排名
4110
昨日變化

1

主題

266

帖子

796

積分

Rank: 5Rank: 5

UID
245227
好友
0
蠻牛幣
977
威望
0
注冊時間
2017-9-21
在線時間
169 小時
最后登錄
2019-8-16
13#
2019-7-29 09:47:08 只看該作者
生成一個Ray 直接獲取......... 你在夢游啊?
回復 支持 反對

使用道具 舉報

5熟悉之中
796/1000
排名
4110
昨日變化

1

主題

266

帖子

796

積分

Rank: 5Rank: 5

UID
245227
好友
0
蠻牛幣
977
威望
0
注冊時間
2017-9-21
在線時間
169 小時
最后登錄
2019-8-16
14#
2019-7-29 09:52:50 只看該作者
1. 不要用除法, 除以2可以寫成乘以0.5
2. 距離如果只是做比較的話, 使用平方距離, Vector3.SqrMagnitude的存在意義就在這里
3. 多了解引擎API 不要自己亂搗鼓反而效率低下, 導致加班
回復 支持 反對

使用道具 舉報

5熟悉之中
661/1000
排名
4751
昨日變化

1

主題

68

帖子

661

積分

Rank: 5Rank: 5

UID
201386
好友
0
蠻牛幣
353
威望
0
注冊時間
2017-1-12
在線時間
284 小時
最后登錄
2019-8-8
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));
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

捕鱼王怎么进不去 pk10滚雪球定位计划 新手棋牌 三公网站 足球即时比 创造与魔法pt是什么意思 二人麻将加班棋牌游戏 全天pk10最精准计划 买双色球彩票 11选5前一自创方法 快三大小单双玩法技巧规律 彩发发安卓版下载 百灵炸金花百人场 抠下面的手法与技巧 福彩3d组六技巧 流量挂机赚钱真的假的 彩九c9 com最新版下载