摘要:最近,我收到一個(gè)客戶的需求,希望可以把的相機(jī)狀態(tài)通過(guò)還原到里。因?yàn)闆](méi)有直接的方法可以修改相機(jī)的值。的相機(jī)視角比的相機(jī)視角寬。調(diào)用以取得焦距。因此,裁剪區(qū)域的范圍計(jì)算為寬度視圖的相機(jī)焦距。高度常規(guī)相機(jī)片幅的比例。
最近,我收到一個(gè)客戶的需求,希望可以把Viewer的相機(jī)狀態(tài)通過(guò)Revit API還原到Revit里。所以我們來(lái)看看要如何實(shí)現(xiàn)這個(gè)要求。在開始之前,你要先知道一些有關(guān)于Revit相機(jī)的事情:
Revit預(yù)設(shè)的相機(jī)FOV值大約為50度,焦距為38.6mm,片幅尺寸為36mm。
Revit默認(rèn)的渲染圖片尺寸為6英吋。
為了調(diào)整Revit相機(jī)的FOV值,我們必須利用修改3D視圖的裁剪尺寸來(lái)完成。因?yàn)镽evit API沒(méi)有直接的方法可以修改相機(jī)的FOV值。
Viewer的相機(jī)視角比Revit的相機(jī)視角寬。
注意:上述關(guān)于Revit的相機(jī)參數(shù)皆為我反復(fù)測(cè)試得出,Revit沒(méi)有確切的值,即皆為近似值。
好的,我們轉(zhuǎn)換過(guò)程的總思路如下(注意:接下來(lái)的步驟適用透視相機(jī)模式):
Forge Viewer的部分:
從當(dāng)前視圖的 Viewer 相機(jī)獲取焦距,目標(biāo),位置和上向量。
調(diào)用 Viewer3D#getFocalLength 以取得焦距。
調(diào)用 Viewer3D#getState({ viewport: true }) 以取得當(dāng)前視圖必要的相機(jī)狀態(tài),例如:
{ "viewport": { "name": "", "eye": [ -14.870469093323, 36.571562767029, -1.2129259109497 ], "target": [ -14.770469665527, 36.571967124939, -1.2129259109497 ], "up": [ 0, 0, 1 ], "worldUpVector": [ 0, 0, 1 ], "pivotPoint": [ -14.770469665527, 36.571967124939, -1.2129259109497 ], "distanceToOrbit": 0.10000024532334, "aspectRatio": 3.1789297658863, "projection": "perspective", "isOrthographic": false, "fieldOfView": 90.68087674208 } }
獲取當(dāng)前加載模型的 global offset(注意:Viewer 默認(rèn)使用 global offset 來(lái)調(diào)整加載模型的位置,以避免浮點(diǎn)運(yùn)算精度和 z-buffer fighting的問(wèn)題):
調(diào)用 viewer.model.getData().globalOffset取得global offset的值,例如:
{ "x": -0.253891, "y": -45.556179, "z": 6.134186 }
從Viewer相機(jī)的目標(biāo)和位置減去 globalOffset:
const state = viewer.getState({ viewport: true }); const globalOffset = viewer.model.getData().globalOffset const currentTarget = new THREE.Vector3().fromArray( state.viewport.target ); // {x: -14.770469665527344, y: 36.571967124938965, z: -1.212925910949707} const currentPosition = new THREE.Vector3().fromArray( state.viewport.eye ); // {x: -14.870469093322754, y: 36.57156276702881, z: -1.212925910949707} const originTarget = currentTarget.clone().add( globalOffset ); // {x: -15.02436066552734, y: -8.984211875061035, z: 4.921260089050291} const originPosition = currentPosition.clone().add( globalOffset ); // {x: -15.12436009332275, y: -8.984616232971192, z: 4.921260089050291}
Revit的部分:
在這個(gè)部分,我們將利用Revit中的裁剪區(qū)域和3D透視圖來(lái)完成我們的目標(biāo)。
使用Viewer的相機(jī)狀態(tài)計(jì)算Revit 3D視圖方向并創(chuàng)建透視3D視圖:
// From Forge Viewer //const currentTarget = new THREE.Vector3().fromArray( state.viewport.target ); // {x: -14.770469665527344, y: 36.571967124938965, z: -1.212925910949707} //const currentPosition = new THREE.Vector3().fromArray( state.viewport.eye ); // {x: -14.870469093322754, y: 36.57156276702881, z: -1.212925910949707} //const originTarget = currentTarget.clone().add( globalOffset ); // {x: -15.02436066552734, y: -8.984211875061035, z: 4.921260089050291} //const originPosition = currentPosition.clone().add( globalOffset ); // {x: -15.12436009332275, y: -8.984616232971192, z: 4.921260089050291} //const up = new THREE.Vector3().fromArray( state.viewport.up ); // {x: 0, y: 0, z: 1} using(var trans = new Transaction(this.Document, "Map LMV Camera")) { try { if(trans.Start() == TransactionStatus.Started) { IEnumerableviewFamilyTypes = from elem in new FilteredElementCollector(this.Document).OfClass(typeof(ViewFamilyType)) let type = elem as ViewFamilyType where type.ViewFamily == ViewFamily.ThreeDimensional select type; // Create a new Perspective View3D View3D view3D = View3D.CreatePerspective(this.Document, viewFamilyTypes.First().Id); Random rnd = new Random(); view3D.Name = string.Format("Camera{0}", rnd.Next()) ; // By default, the 3D view uses a default orientation. // Change the orientation by creating and setting a ViewOrientation3D var position = new XYZ(-15.12436009332275, -8.984616232971192, 4.921260089050291); var up = new XYZ(0,0,1); var target = new XYZ(-15.02436066552734, -8.984211875061035, 4.921260089050291); var sightDir = target.Subtract( position ).Normalize(); var orientation = new ViewOrientation3D( position, up, sightDir ); view3D.SetOrientation( orientation ); // turn off the far clip plane with standard parameter API Parameter farClip = view3D.LookupParameter("Far Clip Active"); farClip.Set(0); Parameter cropRegionVisible = view3D.LookupParameter("Crop Region Visible"); cropRegionVisible.Set(1); Parameter cropView = view3D.LookupParameter("Crop View"); cropView.Set(1); trans.Commit(); } } catch(Exception ex) { trans.RollBack(); TaskDialog.Show("Revit", ex.Message); } }
上述程序代碼的結(jié)果:
使用上述提到經(jīng)過(guò)反復(fù)測(cè)試而來(lái)的相機(jī)參數(shù)來(lái)計(jì)算裁剪區(qū)域的范圍:
Revit 相機(jī)預(yù)設(shè)的 FOV 值近似50度,焦距為38.6mm,片幅尺寸為36mm。
Revit 默認(rèn)的渲染圖片尺寸近似值為6吋。
因此,裁剪區(qū)域的范圍計(jì)算為:
寬度:6" x 38.6 /視圖的相機(jī)焦距。6" x 38.6 / 12 = 19.3" = 490.22 mm
高度:19.3" x 常規(guī)相機(jī)片幅的比例。19.3" x 2/3 = 12.87" = 326.898 mm
透過(guò) Revit UI 設(shè)定 Revit 裁切區(qū)域并記住在裁剪區(qū)域的對(duì)話框中選擇 Field of view:
這是最終結(jié)果:
此篇文章同步發(fā)布于 Forge 官方博客 https://forge.autodesk.com/bl...,希望有幫助!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/105547.html
最近一些Forge客戶都在詢問(wèn)我同一個(gè)的問(wèn)題,他們希望將Revit的網(wǎng)格呈現(xiàn)在viewer中,藉此讓我有機(jī)會(huì)來(lái)完成這件事,并將它記錄在本文章里,就讓我們開始吧! 在開始之前,有件事你必須先知道: 由于在Revit里格子線只能在2D視圖(例如平面圖、立面圖、表單等等)中顯示,并不會(huì)在3D視圖中被看見(jiàn)。因此,我們也無(wú)法在ForgeViewer的3D視圖中看到這些格子線,網(wǎng)格會(huì)在模型轉(zhuǎn)文件時(shí)被忽略。據(jù)我...
摘要:現(xiàn)在讓我們修改這個(gè)示例讓他可以展示兩個(gè)同項(xiàng)目但不同版號(hào)的模型及。示例執(zhí)行結(jié)果如下這邊是這個(gè)比較模型的括展代碼英文原文 showImg(https://segmentfault.com/img/bVOmjp?w=1542&h=925); 熟悉 BIM360 Team 的朋友可能知道他有一個(gè)很牛的模型文檔版本比較的功能,但如果模型是放在 Google 云盤或是百度云盤上有可能做到嗎? Au...
摘要:有提供類似的功能,但這并不包含在里頭。條列清單或是切換視圖是非常容易的,你主要是要建立一個(gè)使用者介面讓使用者去選取他們想觀看的內(nèi)容。我使用了來(lái)確保當(dāng)前載入模型占用的內(nèi)存可以都被釋出。 此篇文章原作是 Autodesk ADN Philippe Leefsma,以下以我簡(jiǎn)稱。 這有一個(gè)簡(jiǎn)易的博客用來(lái)說(shuō)明一個(gè)我剛加入 https://forge-rcdb.autodesk.io 的一個(gè)新功...
摘要:讓我們來(lái)體驗(yàn)的功能。在來(lái)我們就可以將剛剛?cè)〉玫暮蛡魉偷阶约旱姆?wù)器上,同時(shí)儲(chǔ)存到數(shù)據(jù)庫(kù)里面。將來(lái)要回復(fù)的話,就可以先從數(shù)據(jù)庫(kù)獲取和,并透過(guò)下面的方法來(lái)回復(fù)開啟涂丫工具回復(fù)先前制作涂丫時(shí)的畫面的狀態(tài)在圖層上重現(xiàn)涂丫原文 讓我們來(lái)體驗(yàn) Viewer v2.16 Autodesk.Viewing.MarkupsCore 的功能。首先要先確保你使用的 viewer 版號(hào)是正確的: 你知道...
摘要:對(duì)于大多數(shù)的模型文檔都可以透過(guò)服務(wù)提取轉(zhuǎn)換在里渲染構(gòu)件外觀時(shí)所需的材質(zhì)及貼圖。所以我們可以透過(guò)它遍歷所有材質(zhì),找出我們想隱藏貼圖的那些材質(zhì),將它的顏色設(shè)置為灰色,同時(shí)也可以透過(guò)它將隱藏貼圖的材質(zhì)回復(fù)。 這篇文章來(lái)自 Autodesk ADN 的梁曉冬,以下以我簡(jiǎn)稱。 對(duì)于大多數(shù)的模型文檔都可以透過(guò) Autodesk Forge Model Derivative 服務(wù)提取、轉(zhuǎn)換在 Vie...
閱讀 2947·2021-11-11 10:58
閱讀 1996·2021-10-11 10:59
閱讀 3558·2019-08-29 16:23
閱讀 2421·2019-08-29 11:11
閱讀 2846·2019-08-28 17:59
閱讀 3930·2019-08-27 10:56
閱讀 2171·2019-08-23 18:37
閱讀 3168·2019-08-23 16:53