日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF 3D和光照学习1

發布時間:2025/4/14 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF 3D和光照学习1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用 Kaxaml工具;

1 兩個相交面的直射光

首先來參閱網上一段代碼;

<Pagexmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Viewport3D><Viewport3D.Camera><PerspectiveCamera Position="0 0.5 3" LookDirection="0 0 -1"/></Viewport3D.Camera><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><DirectionalLight Direction="1 0 -2"Color="White"/><GeometryModel3D><GeometryModel3D.Geometry><MeshGeometry3D Positions="-1 1 0, 0 1 1, -1 0 0, 0 0 1, 0 1 1, 1 1 0, 0 0 1, 1 0 0"TriangleIndices="2 1 0, 2 3 1, 6 5 4, 6 7 5"/></GeometryModel3D.Geometry><GeometryModel3D.Material><DiffuseMaterial Brush="Green"/></GeometryModel3D.Material></GeometryModel3D></Model3DGroup></ModelVisual3D.Content></ModelVisual3D> </Viewport3D> </Page>

下面是三種不同的情形;差別只在?MeshGeometry3D 標簽里面;

定義兩個簡單的相交面,和直射光;

?

第一個方法就是用最簡單的方法,一次性定義所有的點,兩個面四個三角形一共12個點,TriangleIndices是從0到11;

<MeshGeometry3D Positions="-1 0 0, 0 0 1, 0 1 1, -1 0 0, 0 1 1, -1 1 0, 0 0 1, 1 0 0, 1 1 0, 0 0 1, 1 1 0, 0 1 1"
? ? ? ? ? ? ? ? TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11"/>

? ? ? ? 四個三角形組成兩個相交的面;定義的是直射光,DirectionalLight,所以如圖看不到什么變化;

?

由于WPF計算光照會根據整個平面的方向向量,所以如果在不同面上使用同一個點可能會達到不同的光照效果;
兩個面總共6個點,只定義這6個點,在TriangleIndices中重復利用,代碼:
<MeshGeometry3D Positions="-1 1 0, 0 1 1, 1 1 0, -1 0 0, 0 0 1, 1 0 0"
? ? ? ? ? ? ? ? TriangleIndices="3 1 0, 3 4 1, 4 2 1, 4 5 2"/>

? ? ? ??并沒有得到直射光照效果,使用DirectionalLight;由于頂點被重復利用,同一平面的光照會被不同頂點混合而成了上面的效果;

?

另一種辦法是不在不同面上重復利用頂點,但在相同面上可以重復利用;
這樣兩個面每個面固定4個點一共8個點(介于方法一12個點和方法二6個點之間);
<MeshGeometry3D Positions="-1 1 0, 0 1 1, -1 0 0, 0 0 1, 0 1 1, 1 1 0, 0 0 1, 1 0 0"
? ? ? ? ? ? ? ? TriangleIndices="2 1 0, 2 3 1, 6 5 4, 6 7 5"/>
可以達到和方法一同樣的直射光照效果,同時定義更少的點;

你也可以改變光的顏色,例如 Color="#884433" ,則如下;

2?MeshGeometry3D

Viewport3D控件:這是三維對象元素的上層容器,是相機對象元素Camera、三維圖形呈現對象元素ModelVisual3D的集合;

<PerspectiveCamera Position="0 0.5 3" LookDirection="0 0 -1"/>

? ? ? ? 這是定義攝像機對象的位置和觀看的方向;

?

MeshGeometry3D四個屬性的含義如下圖,主要的東西在這個控件里面;

?

Positions,是頂點位置的集合;

下圖是一個三維坐標系,里面有四個坐標點,也就是頂點位置,都已標出,也就組成了集合(Positions);

TriangleIndices,字面意思是三角形索引的集合;

舉個例子:
TriangleIndices="0 1 2 2 3 0"
? ? 按照圖片顯示的可以翻譯成 “P0 P1 P2,P2 P3 P0”,或者 0 對應 (-1,1,0),1 對應 (-1,-1,0),以此類推。

三角形呈現的是有正反面區分的;WPF采用逆時針的環繞方式來顯示正面;
或者用右手定則:握住右手,伸出拇指,四指為逆時針方向,拇指指向正面;

?

那么前面代碼中類似這樣的,

<MeshGeometry3D Positions="-1 1 0, 0 1 1, -1 0 0, 0 0 1, 0 1 1, 1 1 0, 0 0 1, 1 0 0"
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TriangleIndices="2 1 0, 2 3 1, 6 5 4, 6 7 5"/>

就定義了?頂點位置的集合 和?三角形索引的集合

3 wpf 主要的3D類

如下;

?

總結

以上是生活随笔為你收集整理的WPF 3D和光照学习1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。