1. 程式人生 > >程式設計與數學(一):計算玩家面對面

程式設計與數學(一):計算玩家面對面

最近聽到這樣一個需求,VR多人遊戲的時候,當兩個玩家面對面的情況下,才可以開始下一個流程:

聽到一個人的解決方案是算距離,具體沒問,覺得略感複雜,趁此機會也發揮程式與數學的相關性一直很強,從此篇開始會專門寫一些程式與數學應用的部落格。

好了切入正題,每個角色都有它的朝向,就是transform.forward,代表它的前方朝向,計算兩個角色的朝向,在位置區域被物理限定的情況下,就是不會出現兩個人向背的情況,兩個forword的點乘的值是0代表垂直,1代表同方向,-1代表相反方向,也就是我們的面對面。

如此簡單的解決相問題哈:

下面直接看我們的例項:
1.場景中兩個角色代表
2.指令碼如下:
這裡寫圖片描述

3.執行結果動畫如GIF:
這裡寫圖片描述

可以看到列印日誌,接近0的時候垂直,接近-1的首時候相對,當然實際專案中不需要精準的面對面,只要值得範圍控制在-0.8到-1的範圍。

好了,今天就到這裡,下一篇會考慮一下問題:
1.向背的情況處理
2.兩個角色在多大範圍裡處理相對問題

=============7.29更新===============
之前的方法存在一些問題,不過兩個玩家朝相反方向,也成立-1條件,並且兩個玩家不在一條直線上也會成立,所以今天會另外更新一個方法。

1.確定玩家的朝向關係。
可以獲取兩個玩家的位置向量相減,得到A玩家到B玩家的向量的單位向量,然後與A的Forward向量算點乘夾角來確定玩家朝向。
此時的點乘接近1,A面向B
如果接近-1A背向B

這裡寫圖片描述

2.確定玩家面對面
基於1,確定A面向B,再結合之前的Forward,就可以確定兩個玩家面對面可。

程式碼如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

    public GameObject playerA;
    public GameObject playerB;

    float cos;
    float dir;
    Vector3 vecAB;

    // Update is called once per frame
void Update() { //1 根據距離單位向量,確定一個玩家方向 vecAB = playerB.transform.position - playerA.transform.position; cos = Vector3.Dot(vecAB.normalized, playerA.transform.forward); //Debug.Log(cos); if (cos > 0.8f && cos <= 1f) { Debug.Log("A 面向 B "); } //2 根據Forward點乘,共同確定兩個玩家方向 dir = Vector3.Dot(playerA.transform.forward, playerB.transform.forward); if (dir > -1f && dir < -0.8f) Debug.Log("A與B的方向相反"); //3 根據以上兩個條件共同判斷,兩個玩家相對 if (cos > 0.8f && cos <= 1f) { if (dir > -1f && dir < -0.8f) { Debug.Log("A與B面對面"); } } } }

效果如圖:
這裡寫圖片描述

好啦,玩家面對面的先到這裡,歡迎多多交流!

相關推薦

程式設計數學計算玩家面對面

最近聽到這樣一個需求,VR多人遊戲的時候,當兩個玩家面對面的情況下,才可以開始下一個流程: 聽到一個人的解決方案是算距離,具體沒問,覺得略感複雜,趁此機會也發揮程式與數學的相關性一直很強,從此篇開始會專門寫一些程式與數學應用的部落格。 好了切入正題,每個角色

雲平臺程式設計開發Java雲平臺服務商一覽

因為Java語言的跨平臺性和高度靈活性,成為目前雲端計算平臺的主流開發語言;所以,這裡重點討論一下Java 雲平臺的比較情況。尤其是討論X5Cloud雲平臺與現有幾個Java雲平臺的聯絡和區別:      * App Engine (http://code.google.com/appengine/)    

程式設計數學認識羅馬數字,iphone十不是iphone叉?2的0次方為什麼是1?進位制,指數及0的作用,

最近買了《程式設計師的數學系列》,雖然很多知識比較基礎,但是重新回顧一下會有跟學生時期的不同見解,我們把看到的比較有意思的與大家分享分享: 1.進位制 我們上學的時候都瞭解過2進位制,10進位制,8進位制,16進位制之類的,這裡簡單提一下 2進位制:0,1

C++ STL開發溫習總結 1.C++程式設計技術

 C++ STL開發溫習與總結(一):1.C++程式設計技術       使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術點。 1概論 l  C++語言是基於C語言的語法基礎上融入了其他語

SSH原理運用遠程登錄

獲得 回車 you 密碼登錄 很難 windows 註釋 設備 範圍 SSH是每一臺Linux電腦的標準配置。 隨著Linux設備從電腦逐漸擴展到手機、外設和家用電器,SSH的使用範圍也越來越廣。不僅程序員離不開它,很多普通用戶也每天使用。 SSH具備多種功能,可以用於很多

Flask框架的學習實戰開發環境搭建

進行 read 模型 clas tar pychar html itl .html Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2。很多功能的實現都參考了django框架。由於項

Webpack原理實踐打包流程

寫在前面的話 在閱讀 webpack4.x 原始碼的過程中,參考了《深入淺出webpack》一書和眾多大神的文章,結合自己的一點體會,總結如下。 總述 webpack 就像一條生產線,要經過一系列處理流程後才能將原始檔轉換成輸出結果。 這條生產線上的每個處理流程的職責都是單一的,多個流程之間有存在依賴關

原型鏈繼承六種常見繼承模式

一、原型鏈繼承: function SuperType(){ this.colors = ["red", "blue", "green"]; } SuperType.prototype.Fun = function(){ }; function SubType(){ } //

Kubernetes的搭建配置集群環境搭建

stderr Kubernete lld lsp option control hat tps pan 1、環境介紹及準備: 1.1 物理機操作系統   物理機操作系統采用Centos7.3 64位,細節如下。 [root@localhost ~]# uname -a

程式設計演算法第三週測驗

8:奧運獎牌計數 描述 2008年北京奧運會,A國的運動員參與了n天的決賽專案(1≤n≤17)。現在要統計一下A國所獲得的金、銀、銅牌數目及總獎牌數。2008年北京奧運會,A國的運動員參與了n天的決賽專案(1≤n≤17)。現在要統計一下A國所獲得的金、銀、銅牌

python裝飾器用法計算一個函式執行所需要的時間

import time from functools import wraps def time_this_function(func): #作為裝飾器使用,返回函式執行需要花費的時間

ArcGIS API for JavaScript 實戰解析簡介快速上手

在這篇文章之前廢話幾句。 自從過完十一假期,每天都在奔波和加班中度過,直到今天才真正能夠休息。隱約記得去年是同樣的情形,但並不是相同的事由,希望明年十月對我好一點。 從二月到十月的八個月裡,我幾乎每天都堅持學習,從程式語言、軟體開發到機器學習、WebGIS,還有

QTSQL資料庫的連線

軟體版本:QT5.5.1+Microsoft SQL Server 2008 R2 1,在.Pro檔案中新增程式碼: QT += sql 2,在對應的.h檔案或.cpp檔案中新增引用: #include<QtSql> 3,進行連線配置,共有兩種方法:

【如何自學程式設計系列】如何做到無師自通?

無數莘莘學子為了理想,進行著他鄉求知的旅途。求學生活你要怎麼渡過呢?你是要先享受來之不易的求學生活呢還是繼續為人生目標而奮鬥。閒言少敘,當今社會一步拉下很有可能步步落後。得有憂患意識。誰也不想上完大學結果被大學給上了,畢業季很有可能就是失業季。 每個人都有自己的理想和人生目標,程式設計也

騰訊雲伺服器的配置部署雲伺服器的連線、專案phpphpMyAdmin的部署

【前言】 最近在開發一個小程式,小程式的服務端打算用php來寫。小程式的wx.request必須是https請求,尋找對比了各種雲伺服器,發現騰訊為了推廣小程式,推出了“3元體驗騰訊雲小程式後端解決方案”活動,於是花3元買了騰訊雲伺服器(順帶的還有一臺雲資料庫

程式設計演算法第二週測驗(2017夏季) 解題報告

a 對齊輸出 #include <stdio.h> int main(){ int a,b,c; while (~scanf("%d%d%d",&a,&a

《深入理解Nginx》閱讀實踐Nginx安裝配置HelloWorld

#include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static char* ngx_http_mytest(ngx_conf_t *cf,ngx_command_t *cmd,

【怎樣寫程式碼】函數語言程式設計 -- Lambda表示式引出

如果喜歡這裡的內容,你能夠給我最大的幫助就是轉發,告訴你的朋友,鼓勵他們一起來學習。 If you like the content here, you can give me the greatest help is forwarding, tell you

luaCC呼叫lua

      lua和c有兩種關係:       一種是在lua中呼叫C的函式,C稱為庫程式碼,一種是C中呼叫lua,C就稱為應用程式程式碼,此時C中包含了lua的直譯器    C程式碼部分        注意在C++中,通常要把lua的一些標頭檔案定義在extern “c”

資料結構演算法帶你瞭解時間複雜度和空間複雜度到底是什麼?

1. 前言 演算法(Algorithm)是指用來操作資料、解決程式問題的一組方法。對於同一個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。那麼我們應該如何去衡量不同演算法之間的優劣呢? 主要還是從演算法所佔用的「時間」和「空間」兩個維度去考量。 時間