【OSG學習筆記】Day 15: 路徑動畫與相機漫游

請添加圖片描述
本章來學習下漫游相機。

路徑動畫與相機漫游

本屆內容比較簡單,其實就是實現物體的運動和相機的運動

當然這兩個要一起執行。

貝塞爾曲線

貝塞爾曲線(Bézier curve)是一種在計算機圖形學、動畫制作、工業設計等領域廣泛應用的參數曲線,它由法國工程師皮埃爾?貝塞爾(Pierre Bézier)在 20 世紀 60 年代為汽車工業設計而提出。

大致類似這樣:

在這里插入圖片描述

通過控制一些點來定義整個曲線。

實戰

使用OpenSceneGraph(OSG)實現沿貝塞爾曲線移動模型以及錄制相機路徑的示例代碼。

代碼實現了在OSG中創建一個模型,并讓它沿著貝塞爾曲線移動,同時也記錄相機的路徑。

#include <osg/Group>
#include <osg/Node>
#include <osg/Geometry>
#include <osg/Geode>
#include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator>
#include <osg/MatrixTransform>
#include <osg/AnimationPath>
#include <osg/Quat>
#include <iostream>
#include <vector>// 計算貝塞爾曲線上的點
osg::Vec3 bezierPoint(const std::vector<osg::Vec3>& controlPoints, double t) {int n = controlPoints.size() - 1;osg::Vec3 result(0.0, 0.0, 0.0);for (int i = 0; i <= n; ++i) {double binomial = 1.0;for (int j = 0; j < i; ++j) {binomial *= (n - j) / (i - j);}binomial *= pow(1 - t, n - i) * pow(t, i);result += binomial * controlPoints[i];}return result;
}int main() {// 創建一個場景組osg::ref_ptr<osg::Group> root = new osg::Group;// 創建一個簡單的模型(這里以一個立方體為例)osg::ref_ptr<osg::Geometry> geom = osg::createTexturedCubeGeometry(osg::Vec3(0, 0, 0), 1.0);osg::ref_ptr<osg::Geode> geode = new osg::Geode;geode->addDrawable(geom);root->addChild(geode);// 貝塞爾曲線的控制點std::vector<osg::Vec3> controlPoints = {osg::Vec3(-5, 0, 0),osg::Vec3(-2, 5, 0),osg::Vec3(2, -5, 0),osg::Vec3(5, 0, 0)};// 創建動畫路徑osg::ref_ptr<osg::AnimationPath> animationPath = new osg::AnimationPath;animationPath->setLoopMode(osg::AnimationPath::LOOP);// 采樣貝塞爾曲線生成動畫路徑的關鍵幀const int numSamples = 100;for (int i = 0; i < numSamples; ++i) {double t = static_cast<double>(i) / (numSamples - 1);osg::Vec3 position = bezierPoint(controlPoints, t);osg::Quat orientation; // 這里簡單設置為無旋轉osg::Vec3 scale(1, 1, 1);osg::AnimationPath::ControlPoint cp(static_cast<double>(i) * 0.1, position, orientation, scale);animationPath->insert(cp);}// 創建一個矩陣變換節點來應用動畫路徑osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;mt->addChild(geode);osg::ref_ptr<osg::AnimationPathCallback> callback = new osg::AnimationPathCallback(animationPath);mt->setUpdateCallback(callback);root->addChild(mt);// 創建相機路徑記錄器osg::ref_ptr<osg::Group> cameraPathGroup = new osg::Group;osg::ref_ptr<osg::Vec3Array> cameraPathVertices = new osg::Vec3Array;osg::ref_ptr<osg::Geometry> cameraPathGeom = new osg::Geometry;cameraPathGeom->setVertexArray(cameraPathVertices);osg::ref_ptr<osg::Geode> cameraPathGeode = new osg::Geode;cameraPathGeode->addDrawable(cameraPathGeom);cameraPathGroup->addChild(cameraPathGeode);root->addChild(cameraPathGroup);// 創建查看器osgViewer::Viewer viewer;viewer.setSceneData(root);viewer.setCameraManipulator(new osgGA::TrackballManipulator);// 記錄相機路徑bool recording = false;osg::Vec3 lastCameraPosition;viewer.setCameraManipulator(new osgGA::TrackballManipulator);viewer.realize();while (!viewer.done()) {osg::Matrix cameraMatrix = viewer.getCamera()->getViewMatrix();osg::Vec3 cameraPosition = osg::Vec3(cameraMatrix.getTrans());if (recording) {cameraPathVertices->push_back(cameraPosition);osg::ref_ptr<osg::DrawArrays> drawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP, 0, cameraPathVertices->size());cameraPathGeom->setDrawArray(drawArrays);}// 簡單的按鍵控制記錄開始和結束const osgGA::GUIEventAdapter& ea = viewer.getEventQueue()->getCurrentEvent();if (ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN && ea.getKey() == osgGA::GUIEventAdapter::KEY_R) {recording =!recording;if (recording) {lastCameraPosition = cameraPosition;}}viewer.frame();}return 0;
}

執行效果

在這里插入圖片描述
ok,今天就到這里。明天繼續!

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86241.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LabVIEW自感現象遠程實驗平臺

LabVIEW開發自感現象遠程實驗平臺&#xff0c;通過整合 NI數據采集設備、菲尼克斯&#xff08;Phoenix Contact&#xff09;繼電器模塊及羅技&#xff08;Logitech&#xff09;高清攝像頭&#xff0c;實現遠程數據采集、儀器控制與實時監控三大核心功能。平臺突破傳統實驗裝置局…

數據結構——F/圖

一、圖的基本概念 圖是由頂點集合及頂點間的關系組成的一種數據結構&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 頂點集合V {x|x屬于某個數據對象集}是有窮非空集合&#xff1b; E {(x,y)|x,y屬于V}或者E {<x, y>|x,y屬于V && Path(x, y)…

springcloud openfeign 偶現 Caused by: java.net.UnknownHostException

背景 最近查看日志發現某服務偶現Caused by: java.net.UnknownHostException 同時查看eureka的access.log 出現如下異常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…

第12篇:數據庫中間件日志設計與追蹤系統落地實踐

12.1 引言&#xff1a;中間件日志系統為何如此關鍵&#xff1f; 數據庫中間件作為連接前端應用與后端數據庫的“網關”&#xff0c;承載著路由、負載均衡、SQL 改寫、權限控制等復雜邏輯。 在出現 性能問題、故障排查、安全審計 等場景中&#xff0c;若沒有完善的日志體系&am…

OpenAI對抗法庭命令:捍衛ChatGPT用戶隱私之戰

人工智能公司OpenAI近期正積極對抗一項涉及隱私問題的法庭命令。該命令要求OpenAI保留所有ChatGPT用戶日志&#xff0c;包括已刪除的對話記錄以及通過API調用生成的聊天內容。 命令背后的真實動機 值得注意的是&#xff0c;法院發布這一指令并非出于對用戶隱私或內容安全的考…

嵌入式學習--江協stm32day5

USART 1. 引腳與接口層 異步引腳&#xff1a; TX&#xff1a;發送數據輸出&#xff1b;RX&#xff1a;接收數據輸入&#xff1b;SW_RX&#xff1a;單線半雙工模式的接收引腳&#xff08;替代 RX&#xff09;。 同步引腳&#xff1a;SCLK&#xff1a;同步模式下的時鐘輸出&…

使用Fiddler抓包

有時候需要跟蹤一些小程序的HTTP請求&#xff0c;但是無法像瀏覽器一樣F12查看請求&#xff0c;因此需要借助其他的工具進行&#xff0c;在這里推薦使用Fiddler 配置 此時檢查系統代理已經變成如下配置&#xff1a; 抓包 此時隨便打開一個小程序&#xff0c;就可以進行抓包…

python學習打卡day47

DAY 47 注意力熱圖可視化 昨天代碼中注意力熱圖的部分順移至今天 知識點回顧&#xff1a; 熱力圖 作業&#xff1a;對比不同卷積層熱圖可視化的結果 # 可視化空間注意力熱力圖&#xff08;顯示模型關注的圖像區域&#xff09; def visualize_attention_map(model, test_loader,…

MySQL-運維篇

運維篇 日志 錯誤日志 錯誤日志是 MySQL 中最重要的日志之一&#xff0c;它記錄了當 mysqld 啟動和停止時&#xff0c;以及服務器在運行過程中發生任何嚴重錯誤時的相關信息當數據庫出現任何故障導致無法正常使用時&#xff0c;建議首先查看此日志。 該日志是默認開啟的&am…

Prompt Tuning(提示調優)到底訓練優化的什么部位

Prompt Tuning(提示調優)到底訓練優化的什么部位 在自然語言處理(NLP)領域,Prompt Tuning(提示調優)是一種輕量級的模型優化技術,其核心目標是通過優化提示(Prompt)來引導預訓練語言模型(如GPT、BERT等)更好地完成特定任務,而無需大規模調整模型的主體參數。 一…

基于FPGA的超聲波顯示水位距離,通過藍牙傳輸水位數據到手機,同時支持RAM存儲水位數據,讀取數據。

基于FPGA的超聲波顯示水位距離 前言一、整體框架二、代碼架構1.超聲波測距模塊2.藍牙數據發送模塊3.數碼管數據切換模塊4.數碼管驅動模塊6.串口驅動7.頂層模塊8.RAM ip核 仿真相關截圖 前言 隨著工業化進程的加速和環境保護意識的提升&#xff0c;對水資源管理和水位監測的需求…

OD 算法題 B卷【水果攤小買賣】

文章目錄 水果攤小買賣 水果攤小買賣 小王手里有點閑錢&#xff0c;想做點水果買賣&#xff0c;給出兩個數組m, n&#xff0c; m[i]表示第i個水果的成本價&#xff0c;n[i]表示第i個水果能賣出的價格&#xff1b;假如現在有本錢k&#xff0c;試問最后最多能賺多少錢&#xff1…

(新手友好)MySQL學習筆記(6):分組查詢,正則表達式

目錄 分組查詢 創建分組 過濾分組 分組查詢練習 正則表達式 匹配單個實例 匹配多個實例 正則表達式練習 練習答案 分組查詢練習答案 正則表達式練習答案 分組查詢 創建分組 group by 子句&#xff1a;根據一個或多個字段對結果集進行分組&#xff0c;在分組的字段上…

Android 之 kotlin 語言學習筆記四(Android KTX)

一、Android KTX 簡介 Android KTX 是包含在 Android Jetpack 及其他 Android 庫中的一組 Kotlin 擴展程序。KTX 擴展程序可以為 Jetpack、Android 平臺及其他 API 提供簡潔的慣用 Kotlin 代碼。為此&#xff0c;這些擴展程序利用了多種 Kotlin 語言功能&#xff0c;其中包括&…

云原生思維重塑數字化基座:從理念到實踐的深度剖析

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生為何成為數字化的“基礎設施語言”&#xff1f; 隨著5G、人工智能、物聯網等技術逐步進入規模化落地階段&am…

【C/C++】STL實現版本為什么比手寫版本高?

文章目錄 為什么標準庫版本效率更高&#xff1f;1 具體介紹1.1 **內聯優化&#xff08;Inlining&#xff09;和模板展開**1.2 **分支預測友好&#xff08;Branch Prediction&#xff09;**1.3 **迭代器解耦 靜態分發**1.4 **代碼緊湊&#xff0c;編譯器優化空間大**1.5 **高質…

35.成功解決編寫關于“江協科技”編寫技巧第二期標志位積累的問題

江科大學長又發布了第二期的編寫技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面給了一個未完成的任務&#xff1a; 這里我已經把這個問題給解決了&#xff01; 總代碼放在資源里面&#xff0c;key.c放在文章最后面&#xff01;同時感…

STM32什么是寄存器

提示&#xff1a;文章 文章目錄 前言一、背景二、2.12.2 三、3.1 總結 前言 前期疑問&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空間中&#xff0c;512MB的block2上&#xff0c;每4個字節組成32位&#xff0c;這個32位為一個單元&#xff0c;控制&a…

【Pinia】Pinia和Vuex對比

Pinia 是 Vue 官方團隊成員專門開發的一個全新狀態管理庫&#xff0c;并且 Vue 的官方狀態管理庫已經更改為了 Pinia。 在 Vuex 官方倉庫中也介紹說可以把 Pinia 當成是不同名稱的 Vuex 5&#xff0c;這也意味不會再出 5 版本了。 優點 1. 更加輕量級&#xff0c;壓縮后提交只…

通過 Ansible 在 Windows 2022 上安裝 IIS Web 服務器

拓撲結構 這是一個用于通過 Ansible 部署 IIS Web 服務器的實驗室拓撲。 前提條件&#xff1a; 在被管理的節點上安裝WinRm 準備一張自簽名的證書 開放防火墻入站tcp 5985 5986端口 準備自簽名證書 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…