程式設計與數學(一):計算玩家面對面
最近聽到這樣一個需求,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,還有
QT與SQL(一):與資料庫的連線
軟體版本:QT5.5.1+Microsoft SQL Server 2008 R2 1,在.Pro檔案中新增程式碼: QT += sql 2,在對應的.h檔案或.cpp檔案中新增引用: #include<QtSql> 3,進行連線配置,共有兩種方法:
【如何自學程式設計系列】(一):如何做到無師自通?
無數莘莘學子為了理想,進行著他鄉求知的旅途。求學生活你要怎麼渡過呢?你是要先享受來之不易的求學生活呢還是繼續為人生目標而奮鬥。閒言少敘,當今社會一步拉下很有可能步步落後。得有憂患意識。誰也不想上完大學結果被大學給上了,畢業季很有可能就是失業季。 每個人都有自己的理想和人生目標,程式設計也
騰訊雲伺服器的配置與部署(一):雲伺服器的連線、專案(php與phpMyAdmin)的部署
【前言】 最近在開發一個小程式,小程式的服務端打算用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
lua與C(一):C呼叫lua
lua和c有兩種關係: 一種是在lua中呼叫C的函式,C稱為庫程式碼,一種是C中呼叫lua,C就稱為應用程式程式碼,此時C中包含了lua的直譯器 C程式碼部分 注意在C++中,通常要把lua的一些標頭檔案定義在extern “c”
資料結構與演算法(一):帶你瞭解時間複雜度和空間複雜度到底是什麼?
1. 前言 演算法(Algorithm)是指用來操作資料、解決程式問題的一組方法。對於同一個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。那麼我們應該如何去衡量不同演算法之間的優劣呢? 主要還是從演算法所佔用的「時間」和「空間」兩個維度去考量。 時間