基于WPF實(shí)現(xiàn)3D畫廊動(dòng)畫效果的示例代碼
接下來想做一個(gè)圖廊,所以并沒有必要用立方體,只需做一些“墻壁”就行了。
而在一個(gè)平面上建起另一個(gè)矩形的平面,實(shí)則非常容易,只需輸入墻角的兩點(diǎn)和高度就可以了,這對于寫過正方體的人來說絕對是簡單得很,無非是把四個(gè)點(diǎn)劈成兩個(gè)三角形
private MeshGeometry3D MakeSurface(Point3D p0, Point3D p1, Point3D p2, Point3D p3) { MeshGeometry3D mesh = new MeshGeometry3D(); Point3D[] pts ={p0, p1, p2, p3}; foreach (var pt in pts) mesh.Positions.Add(pt); foreach (var i in new int[6] { 0, 1, 2, 2, 3, 0 }) mesh.TriangleIndices.Add(i); ??????? return mesh; }
接下來可以像之前做正方體時(shí)那樣,先做一個(gè)平的地面,然后在地面上放置一些正方體。
由于地面上的正方形要求垂直于地面,所以重載一下
private MeshGeometry3D MakeSurface(Point p0, Point p1, double high) { return MakeSurface( new Point3D(p0.X, 0, p0.Y), new Point3D(p1.X, 0, p1.Y), new Point3D(p1.X, high, p1.Y), new Point3D(p0.X, high, p0.Y)); }
然后生成模型
代碼為
private void DefineModel(Model3DGroup group) { // Make the ground. const double wid = 10; MeshGeometry3D groundMesh = MakeSurface( new Point3D(-wid, 0, -wid), new Point3D(-wid, 0, +wid), new Point3D(+wid, 0, +wid), new Point3D(+wid, 0, -wid)); DiffuseMaterial groundMaterial = new DiffuseMaterial(Brushes.DarkGray); GeometryModel3D groundModel = new GeometryModel3D(groundMesh, groundMaterial); group.Children.Add(groundModel); MaterialGroup gpMaterial; for (int x = -2; x <= 2; x += 2) { for (int y = -2; y <= 2; y += 2) { MeshGeometry3D mesh = MakeSurface(new Point(x, y), new Point(x, y + 1), 1); byte r = (byte)(128 + x * 50); byte g = (byte)(128 + y * 50); byte b = (byte)(128 + x * 50); Color color = Color.FromArgb(255, r, g, b); DiffuseMaterial material = new DiffuseMaterial( new SolidColorBrush(color)); GeometryModel3D model = new GeometryModel3D(mesh, material); group.Children.Add(model); } } }
接下來就是掛載貼圖,結(jié)果大致如下
其方法也很簡單,就是把material變成想要的圖片,故而先把圖像放在一個(gè)字符串?dāng)?shù)組里
static readonly string[] imgs = new string[9] { "2d1.png","2d2.png","2d3.png","2d4.png","2d5.png", "2d6.png","2d7.png","2d8.png","2d9.png" };
接下來需要注意一點(diǎn),圖像本身需要一個(gè)坐標(biāo)系,故而要把墻壁的代碼改為
private MeshGeometry3D MakeSurface(Point p0, Point p1, double high, string uri = null) { var mesh = MakeSurface( new Point3D(p0.X, 0, p0.Y), new Point3D(p1.X, 0, p1.Y), new Point3D(p1.X, high, p1.Y), new Point3D(p0.X, high, p0.Y)); //這四個(gè)點(diǎn)代表圖像上的坐標(biāo)和圖形中點(diǎn)的對應(yīng)關(guān)系 Point[] textureCoods = new Point[4] { new Point(0, 1),new Point(1, 1), new Point(1, 0),new Point(0, 0), }; foreach (var pt in textureCoods) mesh.TextureCoordinates.Add(pt); return mesh; }
然后在生成正方形時(shí),用圖像取代顏色
ImageBrush imgBrush = new ImageBrush(); imgBrush.ImageSource = new BitmapImage(new Uri( $"imgs//{imgs[k++]}", UriKind.Relative)); MeshGeometry3D mesh = MakeSurface(new Point(x, y), new Point(x, y + 1), 1); GeometryModel3D model = new GeometryModel3D(mesh, new DiffuseMaterial(imgBrush)); group.Children.Add(model);
這樣二次元妹紙就花在墻壁上啦。
當(dāng)然,如果想象力豐富的話可以把墻壁連在一起像迷宮那種,肯定會(huì)有沉浸式的體驗(yàn)。
到此這篇關(guān)于基于WPF實(shí)現(xiàn)3D畫廊動(dòng)畫效果的示例代碼的文章就介紹到這了,更多相關(guān)WPF 3D畫廊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)閃動(dòng)托盤圖標(biāo)效果的方法
這篇文章主要介紹了C#實(shí)現(xiàn)閃動(dòng)托盤圖標(biāo)效果的方法,涉及C# ImageList控件的使用技巧,需要的朋友可以參考下2016-06-06C#/.Net開發(fā)chatGPT、openAI的簡單步驟
OpenAI處于科技行業(yè)下一件大事件的最前沿,具有初創(chuàng)公司史詩般的標(biāo)志,下面這篇文章主要給大家介紹了關(guān)于C#/.Net開發(fā)chatGPT和openAI的相關(guān)資料,需要的朋友可以參考下2023-02-02Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01MessageBox的Buttons和三級聯(lián)動(dòng)效果
這篇文章主要介紹了MessageBox的Buttons和三級聯(lián)動(dòng)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-1112306奇葩驗(yàn)證碼引發(fā)思考之C#實(shí)現(xiàn)驗(yàn)證碼程序
春運(yùn)最高峰來了!明天通過網(wǎng)絡(luò)將能買到小年夜的車票,本周四就將開售除夕日車票,但不少人被首次在春運(yùn)期間使用的圖片驗(yàn)證碼搞得很火大,小編也正在對驗(yàn)證碼進(jìn)行研究,編寫了由C#實(shí)現(xiàn)驗(yàn)證碼程序,分享給大家2015-12-12