国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Overload游戲引擎細節(jié)分析】鼠標鍵盤控制攝像機原理

這篇具有很好參考價值的文章主要介紹了【Overload游戲引擎細節(jié)分析】鼠標鍵盤控制攝像機原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在上文中分析了攝像機類的實現(xiàn),在計算投影視圖矩陣時需要給攝像機輸入其位置及轉(zhuǎn)動四元數(shù)。這兩個量一般通過鼠標鍵盤來控制,從而達到控制攝像機的目的。本文分析一下其控制原理。

Overload的攝像機控制實現(xiàn)在類CameraController中,其有三個個方法HandleCameraPanning、HandleCameraFPSMouse、HandleCameraOrbit、HandleCameraZoom是鼠標控制攝像機的平移、繞自身轉(zhuǎn)動、繞特定點轉(zhuǎn)動、縮放。還有一個方法,HandleCameraFPSKeyboard是鍵盤控制攝像機。其頭文件如下,已刪除本文不關注的代碼及字段。

namespace OvEditor::Core
{
	class CameraController
	{
	private:
		// 控制攝像機的平移
		void HandleCameraPanning(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse);
		// 控制攝像機繞物體進行旋轉(zhuǎn)
		void HandleCameraOrbit(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse);
		// 鼠標控制攝像機旋轉(zhuǎn)
		void HandleCameraFPSMouse(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse);

		// 控制滾輪放大縮小
		void HandleCameraZoom();
		// 鍵盤控制攝像機
		void HandleCameraFPSKeyboard(float p_deltaTime);
		void UpdateMouseState();

	private:
		OvRendering::LowRenderer::Camera& m_camera; // 當前攝像機
		OvMaths::FVector3& m_cameraPosition; // 當前攝像機的位置
		OvMaths::FQuaternion& m_cameraRotation; // 當前攝像機的旋轉(zhuǎn)四元數(shù)
	};
}

這四個函數(shù)就是通過改變m_cameraPosition、m_cameraRotation從而達到控制攝像機的目的。

一、鼠標控制縮放HandleCameraZoom
鼠標控制縮放的代碼如下:

void OvEditor::Core::CameraController::HandleCameraZoom()
{
	m_cameraPosition += m_cameraRotation * OvMaths::FVector3::Forward * ImGui::GetIO().MouseWheel;
}

OvMaths::FVector3::Forward是固定矢量(0,0,1),其與m_cameraRotation相乘獲取當前攝像機的Z軸,也叫Forward量,或可稱為攝像機的指向。Imgui可獲取鼠標滾輪的轉(zhuǎn)動量,與Forward相乘,累加到攝像機位置上,產(chǎn)生攝像機拉進或拉遠的效果。在其他軟件中,我還見到過通過改變視口的大小實現(xiàn)縮放的,這種改變攝像機位置方式感覺更直觀。但這種方式對正向相機缺點:滾輪不能縮放物體,因為正交投影相當于將物體放到一個正方形盒子中,在盒子一側(cè)看,這個物體沿深度方向改變是不會有近大遠小的效果的。所以一些工業(yè)軟件中使用改變視口大小,實現(xiàn)物體縮放效果。

二、鼠標控制平動HandleCameraPanning

void OvEditor::Core::CameraController::HandleCameraPanning(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouset)
{
   // 根據(jù)設置的拖動速度計算增量
	auto mouseOffset = p_mouseOffset * m_cameraDragSpeed;
	
	// 攝像機位置沿著Right、Up軸移動
	m_cameraPosition += m_cameraRotation * OvMaths::FVector3::Right * mouseOffset.x;
	m_cameraPosition -= m_cameraRotation * OvMaths::FVector3::Up * mouseOffset.y;
}

p_mouseOffset是鼠標移動矢量,是二維向量,但攝像機坐標系有三個軸,所以只能控制兩個軸的平動。

三、鼠標控制繞自身轉(zhuǎn)動HandleCameraFPSMouse
這個函數(shù)實現(xiàn)攝像機繞自身原點轉(zhuǎn)動。p_firstMouse是當鼠標按下是為true,轉(zhuǎn)動過程中為false。當?shù)谝淮无D(zhuǎn)動時,先將轉(zhuǎn)動轉(zhuǎn)換為歐拉角,RemoveRoll是對歐拉角做特殊處理,看著像是為了克服萬向節(jié)死鎖,沒看太明白,有用的時候再來深究吧。

void OvEditor::Core::CameraController::HandleCameraFPSMouse(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse)
{
	auto mouseOffset = p_mouseOffset * m_mouseSensitivity;

	if (p_firstMouse)
	{
		m_ypr = OvMaths::FQuaternion::EulerAngles(m_cameraRotation);
		m_ypr = RemoveRoll(m_ypr);
	}

	m_ypr.y -= mouseOffset.x;
	m_ypr.x += -mouseOffset.y;
	m_ypr.x = std::max(std::min(m_ypr.x, 90.0f), -90.0f);

	m_cameraRotation = OvMaths::FQuaternion(m_ypr);
}

鼠標偏移量改變歐拉角,注意其改變的值是x、y分量,最后再轉(zhuǎn)換為四元數(shù)。

四、攝像機繞特殊點旋轉(zhuǎn)HandleCameraOrbit
這個實際軟件中使用也很多。這個相對于繞攝像機原點旋轉(zhuǎn)多了平移分量,會同時改變攝像機的位置與姿態(tài)。

void OvEditor::Core::CameraController::HandleCameraOrbit(const OvMaths::FVector2& p_mouseOffset, bool p_firstMouse)
{
	auto mouseOffset = p_mouseOffset * m_cameraOrbitSpeed; // 鼠標偏移量

	if (p_firstMouse)
	{
		m_ypr = OvMaths::FQuaternion::EulerAngles(m_cameraRotation); // 轉(zhuǎn)換為歐拉角
		m_ypr = RemoveRoll(m_ypr); // 可能是為了解決萬向節(jié)死鎖
		m_orbitTarget = &EDITOR_EXEC(GetSelectedActor()).transform.GetFTransform();
		m_orbitStartOffset = -OvMaths::FVector3::Forward * OvMaths::FVector3::Distance(m_orbitTarget->GetWorldPosition(), m_cameraPosition); // 攝像機需要平移的量(攝像機局部坐標系下)
	}

	m_ypr.y += -mouseOffset.x;  // 對歐拉角進行改變
	m_ypr.x += -mouseOffset.y;
	m_ypr.x = std::max(std::min(m_ypr.x, 90.0f), -90.0f);

	auto& target = EDITOR_EXEC(GetSelectedActor()).transform.GetFTransform();
	OvMaths::FTransform pivotTransform(target.GetWorldPosition());
	OvMaths::FTransform cameraTransform(m_orbitStartOffset); // 設置攝像機平移量
	cameraTransform.SetParent(pivotTransform); 
	pivotTransform.RotateLocal(OvMaths::FQuaternion(m_ypr)); // 將繞的點進行旋轉(zhuǎn)
	m_cameraPosition = cameraTransform.GetWorldPosition();  // 獲取攝像機位置
	m_cameraRotation = cameraTransform.GetWorldRotation(); // 獲取攝像機轉(zhuǎn)角
}

其原理是將圍繞的點進行旋轉(zhuǎn),再平移獲取攝像機的位置及姿態(tài)。

五、鍵盤控制攝像機平動HandleCameraFPSKeyboard
這個函數(shù)原理類似于鼠標平動,都是線用轉(zhuǎn)動四元數(shù)獲取當前軸,給位置一個增量即可,這里就不詳細分析了。

如何使用這些函數(shù)與產(chǎn)品設計相結(jié)合?
上面只是攝像機控制的單個函數(shù),想在產(chǎn)品中集成還需其他的GUI庫(如QT、glfw、imgui等)配合獲取鼠標鍵盤狀態(tài),不斷分情況調(diào)用這些函數(shù)。這些代碼差異較大,跟產(chǎn)品設計密切相關,不具有通用性,不再分析。Overload這部分代碼在CameraController::HandleInputs函數(shù)中,有興趣可以閱讀。文章來源地址http://www.zghlxwxcb.cn/news/detail-721480.html

到了這里,關于【Overload游戲引擎細節(jié)分析】鼠標鍵盤控制攝像機原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【Overload游戲引擎細節(jié)分析】畫場景柵格的Shader分析

    【Overload游戲引擎細節(jié)分析】畫場景柵格的Shader分析

    Overload引擎地址: GitHub - adriengivry/Overload: 3D Game engine with editor 一、柵格繪制基本原理 Overload Editor啟動之后,場景視圖中有柵格線,這個在很多軟件中都有。剛開始我猜測它應該是通過繪制線實現(xiàn)的。閱讀代碼發(fā)現(xiàn),這個柵格的幾何網(wǎng)格只有兩個三角形面片組成的正方形,使

    2024年02月07日
    瀏覽(24)
  • 【Overload游戲引擎細節(jié)分析】PBR材質(zhì)Shader---完結(jié)篇

    【Overload游戲引擎細節(jié)分析】PBR材質(zhì)Shader---完結(jié)篇

    PBR基于物理的渲染可以實現(xiàn)更加真實的效果,其Shader值得分析一下。但PBR需要較多的基礎知識,不適合不會OpenGL的朋友。 一、PBR理論 PBR指基于物理的渲染,其理論較多,需要的基礎知識也較多,我在這就不再寫一遍了,具體可以參看: LearnOpenGL PBR理論-英文 或者 LearnOpenGL

    2024年02月08日
    瀏覽(31)
  • 【Overload游戲引擎細節(jié)分析】UBO與SSBO的封裝

    一、OpenGL的UBO ? 在OpenGL Shader中,如果邏輯比較復雜,使用的uniform變量較多。通常多個著色器使用同一個uniform變量。由于uniform變量的位置是著色器鏈接時候產(chǎn)生的,因此它在應用程序中獲得的索引會有變化。Uniform Buffer Object(UBO)是一種優(yōu)化uniform變量訪問,不同著色器直接

    2024年02月07日
    瀏覽(24)
  • 【UE5 智慧城市系列】5-通過鼠標鍵盤控制攝像機

    【UE5 智慧城市系列】5-通過鼠標鍵盤控制攝像機

    通過鼠標WASD鍵控制攝像機前后左右移動,鼠標滾輪控制彈簧臂長度的修改,鼠標中鍵控制攝像機旋轉(zhuǎn)。 1. 首先創(chuàng)建一個游戲模式,這里命名為“BP_GameMode” 2. 再創(chuàng)建一個玩家控制器,這里命名為“BP_PlayerController” 3. 新建一個玩家控制的Pawn,這里命名為“BP_CameraPawn” 4. 打開

    2024年02月09日
    瀏覽(25)
  • Unity3D攝像機,鍵盤控制前后左右上下移動,鼠標控制旋轉(zhuǎn)、放縮

    Unity3D中運行場景時,實現(xiàn)攝像機的前、后、左、右、上、下,以及鼠標滾輪的放縮,鼠標右鍵的旋轉(zhuǎn)操作。親測有效,可供參考。 按鍵功能介紹:W——前;S——后;A——左;D——右;Q——下降;E——上升;鼠標右鍵——旋轉(zhuǎn);鼠標滾輪——放縮。 Tourcamera腳本需要掛在攝

    2024年02月11日
    瀏覽(26)
  • 瓦片地圖編輯器——實現(xiàn)卡馬克卷軸的編輯,鍵盤控制游戲移動和鼠標點擊游戲編輯通過同一個視口實現(xiàn)。

    瓦片地圖編輯器——實現(xiàn)卡馬克卷軸的編輯,鍵盤控制游戲移動和鼠標點擊游戲編輯通過同一個視口實現(xiàn)。

    ? 左邊是游戲地圖編輯區(qū),右邊是地圖緩沖區(qū),解決了地圖緩沖區(qū)拖動bug,成功使得緩沖區(qū)可以更新。 AWSD進行移動 鼠標左右鍵分別是繪制/拖動 按F1健導出為mapv3.txt F2清空數(shù)組 打印的是游戲數(shù)組 easyx開發(fā)devcpp 5.11 easyx20220922版本

    2024年01月25日
    瀏覽(31)
  • Unity【角色/攝像機移動控制】【2.角色跟隨鼠標轉(zhuǎn)向】

    本章代碼實現(xiàn)基于本系列的【1.角色移動】 在前面的基礎上,我們在PlayerController腳本中添加如下函數(shù),隨后在update方法中調(diào)用即可: 其中mouseSensitivity是前面自定義的一個float變量,用來調(diào)節(jié)對鼠標轉(zhuǎn)向速度,至此,當我們轉(zhuǎn)動鼠標,角色也會跟著轉(zhuǎn)動

    2024年02月22日
    瀏覽(19)
  • 【UE4】 通過按鈕點擊實現(xiàn)攝像機的切換 并通過鼠標控制新攝像機的旋轉(zhuǎn)

    【UE4】 通過按鈕點擊實現(xiàn)攝像機的切換 并通過鼠標控制新攝像機的旋轉(zhuǎn)

    首先創(chuàng)建了4個Actor藍圖類 每個藍圖類內(nèi)只擁有一個攝像機組件 將每個actor藍圖類擺放到場景的合適位置 在關卡藍圖中創(chuàng)建自定義事件,當該事件觸發(fā)時切換攝像機 創(chuàng)建一個控件藍圖,在控件藍圖中創(chuàng)建如下5個按鈕,并創(chuàng)建點擊事件。按鈕分別表示車上的4個鏡頭和車外自由

    2023年04月09日
    瀏覽(100)
  • UE5回合制游戲【2-攝像機控制】(藍圖版)

    UE5回合制游戲【2-攝像機控制】(藍圖版)

    上一篇文章完成了一些基礎的設置,這篇文章主要來設置一下攝像機。 攝像機的控制主要有鼠標滾輪控制縮放,WASD鍵控制前后左右移動,QE鍵控制左右旋轉(zhuǎn)。 首先打開BP_Pawn,然后添加Spring和Camera組件。 層級關系如下圖 我們把攝像機放到彈簧臂下面,這樣攝像機就能跟著彈

    2024年02月03日
    瀏覽(19)
  • Unity制作射擊游戲案例01(控制角色+發(fā)射子彈+攝像機跟蹤)

    Unity制作射擊游戲案例01(控制角色+發(fā)射子彈+攝像機跟蹤)

    //【業(yè)務邏輯】這個腳本用來1.控制物體移動旋轉(zhuǎn)(WASD)、? ?2.發(fā)射子彈(空格鍵) //【程序邏輯2】 首先檢測用戶沒有按下空格鍵 2.如果按下呢執(zhí)行發(fā)射子彈函數(shù)?? ?3.克隆子彈 4.讓克隆的子彈往前跑 為子彈模板添加剛體,并且限制旋轉(zhuǎn) 這個腳本需要掛在到攝像機,里面談

    2024年02月06日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包