最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

股票量化:赫茲量化國聯(lián)期貨極速版平臺利用 DirectX 創(chuàng)建 3D 圖形

2023-11-06 15:36 作者:大牛啊呢  | 我要投稿

物體建模

若要在平面空間上繪制三維物體,應首先得到 X、Y 和 Z 軸坐標上的物體模型。 這意味著物體表面上的每個點均要以特定坐標定義。 理想情況下,需要定義物體表面上的無數(shù)個點,從而在縮放圖像時保持品質。 實際上,3D 建模是以多邊形組成的網(wǎng)模來定義。 多邊形端點越多,則網(wǎng)模越詳盡,提供的模型越加真實。 然而,計算這樣的模型和渲染 3D 圖形需要更多的計算機資源。 早期的計算機圖形不得不在較弱的圖形卡上運行,故將多邊形切分成三角形很久以前就出現(xiàn)了。 三角形可精確描述小表面部件的位置,以及計算相關參數(shù),例如光照和光線反射。 這樣的小三角形的集合能夠創(chuàng)建逼真的物體三維圖像。 在下文中,多邊形和三角形將歸并為同義詞,因為想象三角形較之擁有 N 個頂點的多邊形,顯然容易得多。


按照三角形每個頂點的坐標定義來創(chuàng)建物體的三維模型,如此,即便物體移動或觀察者的位置發(fā)生變化,也可以進一步計算物體每個點的坐標。 所以,我們要處理的是頂點,連接頂點的邊線,以及由邊線形成的表面。 如果知道三角形的位置,則可以利用線性代數(shù)定律來創(chuàng)建切面法線(法線是垂直于表面的向量)。 如此即可計算出切面如何光照,以及光線如何從切面反射。

造型

我們編寫一個創(chuàng)建立方體的簡單程序。 利用 3D 圖形庫中的 CCanvas3D 類。

渲染 3D 窗體的 CCanvas3DWindow 類擁有最少的成員和方法。 我們將逐步添加新方法,并針對操控 DirectX 函數(shù)中所實現(xiàn)的 3D 圖形概念加以解釋。

//+------------------------------------------------------------------+ //| 應用窗體 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ class CCanvas3DWindow ?{ protected: ? CCanvas3D ? ? ? ? m_canvas; ? //--- 畫布尺寸 ? int ? ? ? ? ? ? ? m_width; ? int ? ? ? ? ? ? ? m_height; ? //--- 立方體 ? CDXBox ? ? ? ? ? ?m_box; public: ? ? ? ? ? ? ? ? ? ? CCanvas3DWindow(void) {} ? ? ? ? ? ? ? ? ? ?~CCanvas3DWindow(void) {m_box.Shutdown();} ? //-- 創(chuàng)建場景 ? virtual bool ? ? ?Create(const int width,const int height){} ? //--- 計算場景 ? void ? ? ? ? ? ? ?Redraw(){} ? //--- 響應圖表事件 ? void ? ? ? ? ? ? ?OnChartChange(void) {} ?};

場景的創(chuàng)建要從創(chuàng)建畫布開始。 然后為投影矩陣設置以下參數(shù):

  1. 30 度視角(M_PI/6),從這處我們觀看 3D 場景

  2. 縱橫比(寬度與高度比率)

  3. 距剪切面近處(0.1f)到遠處(100.f)的距離

這意味著僅在投影矩陣中渲染物體處于兩堵虛構墻面(0.1f 和 100.f)之間的部分。 另外,物體必須落入視角的水平 30 度夾角。 請注意,距離以及計算機圖形中的所有坐標都是虛構的。 重要的是距離和大小之間的相對關系,而不是絕對值。


? //+------------------------------------------------------------------+ ? //| 創(chuàng)建 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+------------------------------------------------------------------+ ? virtual bool ? ? ?Create(const int width,const int height) ? ? { ? ? ?//--- 保存畫布維度 ? ? ?m_width=width; ? ? ?m_height=height; ? ? ?//--- 為渲染 3D 場景而創(chuàng)建畫布 ? ? ?ResetLastError(); ? ? ?if(!m_canvas.CreateBitmapLabel("3D Sample_1",0,0,m_width,m_height,COLOR_FORMAT_ARGB_NORMALIZE)) ? ? ? ?{ ? ? ? ? Print("Error creating canvas: ",GetLastError()); ? ? ? ? return(false); ? ? ? ? } ? ? ?//--- 設置投影矩陣參數(shù)-視角、縱橫比、與剪裁面的近端和遠端距離 ? ? ?m_canvas.ProjectionMatrixSet((float)M_PI/6,(float)m_width/m_height,0.1f,100.0f); ? ? ?//--- 創(chuàng)建立方體 - 將立方體的兩個對角坐標、資源管理器、場景參數(shù)傳遞給它 ? ? ?if(!m_box.Create(m_canvas.DXDispatcher(),m_canvas.InputScene(),DXVector3(-1.0,-1.0,5.0),DXVector3(1.0,1.0,7.0))) ? ? ? ?{ ? ? ? ? m_canvas.Destroy(); ? ? ? ? return(false); ? ? ? ? } ? ? ?//--- 在場景里加入立方體 ? ? ?m_canvas.ObjectAdd(&m_box); ? ? ?//--- 刷新場景 ? ? ?Redraw(); ? ? ?//--- 成功 ? ? ?return(true); ? ? ?}


創(chuàng)建投影矩陣后,我們可以繼續(xù)構建 3D 物體 — 基于 CDXBox 類的立方體。 為了創(chuàng)建一個立方體,指定立方體兩個對角的頂點即可。 通過在調試模式下觀察立方體的創(chuàng)建,您可以看到 DXComputeBox() 中所發(fā)生的情況:創(chuàng)建立方體的所有頂點(它們的坐標已寫入 “vertices” 數(shù)組),以及把立方體邊線切分為三角形,列舉并保存在 “indiсes” 數(shù)組當中。 立方體總共有 8 個頂點,6 個切面切分為 12 個三角形,這些三角形頂點列舉為 36 個索引。

盡管立方體只有 8 個頂點,但由于要為 6 個切面中的每條法線指定單獨的頂點集合,所以創(chuàng)建了 24 個頂點來描述它們。 法線方向會影響每個切面的光照計算。 三角形頂點在索引中的列舉順序決定了可見的三角形邊線。 在 DXUtils.mqh 代碼里展示了頂點和索引的填充順序:

? for(int i=20; i<24; i++) ? ? ?vertices[i].normal=DXVector4(0.0,-1.0,0.0,0.0);

在同一代碼里為每個切面的紋理映射定義了紋理坐標:

//--- 紋理坐標 ? for(int i=0; i<faces; i++) ? ? { ? ? ?vertices[i*4+0].tcoord=DXVector2(0.0f,0.0f); ? ? ?vertices[i*4+1].tcoord=DXVector2(1.0f,0.0f); ? ? ?vertices[i*4+2].tcoord=DXVector2(1.0f,1.0f); ? ? ?vertices[i*4+3].tcoord=DXVector2(0.0f,1.0f); ? ? ?}

4 個切面頂點中的每一個都設置了 4 個角度的紋理映射。 這意味著每個立方體切面在渲染紋理時都會映射一小隊結構。 當然,只在設置紋理的情況下才需要這樣做。


股票量化:赫茲量化國聯(lián)期貨極速版平臺利用 DirectX 創(chuàng)建 3D 圖形的評論 (共 條)

分享到微博請遵守國家法律
精河县| 滕州市| 通渭县| 婺源县| 宾阳县| 玉田县| 息烽县| 石狮市| 江山市| 都昌县| 桑植县| 博爱县| 青州市| 乐平市| 龙南县| 建始县| 石城县| 绥德县| 江油市| 天门市| 慈溪市| 应用必备| 榆中县| 黄龙县| 中山市| 黑河市| 汽车| 万州区| 芜湖县| 滦南县| 三明市| 辽宁省| 克什克腾旗| 邳州市| 和田县| 望江县| 祥云县| 阿拉善左旗| 潞西市| 井研县| 安国市|