簡體   English   中英

如何獨立於主渲染循環逐步執行算法(出現提示時)?

[英]How do I step through an algorithm (when prompted) independent of the main render loop?

我目前正在使用Irrlicht Engine在3D中實現QuickHull算法。 用戶將可以在按鍵時逐步瀏覽算法,逐個步進行。

我想獨立於主渲染循環執行此操作,以免在等待用戶輸入時停止整個模擬。 用戶應該能夠平移相機並查看發生了什么情況。

我目前有一個包含所有點和線段的QuickHull容器類以及該算法的方法。 如何獲得此方法以按需暫停並等待用戶輸入,而又不停止渲染循環或隨着渲染循環的進行而意外中斷遞歸?

以下不是最佳的內存解決方案,但可以解決:

當用戶運行QuickHull時,實際上要運行整個解決方案。 但是,隨時保存中間狀態。 在最壞的情況下,如果所有點都位於凸包(即凸多邊形)上並以O(n 2 )時間運行,則QHull需要O(n)內存,因此,如果要生成中間狀態,則需要存儲大小為1,2,3,...,n的向量以表示每個階段的船體,這可能會導致O(n 3 )的總額外內存。

隨着您逐步生成船體,請為每個迭代創建一組新的點,以表示該船體在該時刻的外觀。 要表示生成的凸包,請在運行時為包上的每個點添加球體場景節點。

您可以使用irr::scene::ISceneManager::addSphereSceneNode(radius)函數將球體添加到場景中,該函數返回一個IMeshSceneNode* ,您可以將其推入表示該狀態下凸包的向量。

要顯示這些點之間的邊緣,需要在球體之間繪制直線。 因此,對於當前船體中的每個點,在它們之間畫一條線(也是最后和第一個之間的線)

您可以使用irr::video::IVideoDriverdraw3DLine命令繪制一條線,如下draw3DLine

irr::video::SMaterial lineMaterial;
lineMaterial.Lighting = false;
lineMaterial.Thickness = 2.0f;
lineMaterial.FrontfaceCulling = false;
lineMaterial.BackfaceCulling = false;
lineMaterial.MaterialType = irr::video::EMT_SOLID;
_driver->setMaterial(lineMaterial);
_driver->setTransform(irr::video::ETS_WORLD,
                irr::core::IdentityMatrix);

//draw a line
irr::core::vector3df lineStart,lineEnd; //set these equal to 2 adjacent vertices on your hull
_driver->draw3DLine(lineStart,lineEnd,irr::video::SColor(0.0,0.0,0.0,205)); //blue line

最初,您添加到場景中的所有IMeshSceneNode*應該是不可見的。 在創建向量時,請在向量中的每個球體上使用命令void irr::scene::ISceneNode::setVisible(bool isVisible)

現在,在運行QHull算法之后,您可以在狀態向量中創建一個索引(每個狀態在一個時間步上代表船體,它本身就是一個向量)。

遞增索引時,可以將當前狀態(遞增之前)的所有球體設置為不可見,然后使處於下一個狀態的所有球體可見。

您的主渲染循環還應該調用一些函數,以當前ConvexHull狀態渲染邊緣。

該模型的優點在於,用戶現在可以向前和向后查看算法的進展情況。 如果您只是向前走,則可以使代表船體的先前節點不可見,而可以將其完全從場景中刪除。

同樣,對於該模型,我們不需要嘗試使用某些奇怪的線程模型在執行過程中暫停QHull算法,也不需要大量修改算法本身以使其能夠暫停和恢復。 您只需在每一幀渲染當前的Hull狀態,就可以EventReceiver移動相機並對其進行查看,然后使用自己的EventReceiver類通過按下按鈕來更新該EventReceiver

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM