最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#?WPF實現(xiàn)3D操作幾何體效果

 更新時間:2023年03月02日 10:28:43   作者:微小冷  
眾所周知,我的世界就是無數(shù)個像素塊的集合,而像素塊也就是立方體。關(guān)于新建立方體,這個大家已經(jīng)非常熟練了,本文就來說說如何實現(xiàn)3D操作幾何體效果吧

操作幾何體

據(jù)說我的世界是三個程序員用一周開發(fā)出來的,那一個程序員用半天開發(fā)出一個乞丐版的我的世界,講道理是完全沒有問題的。

而眾所周知,我的世界就是無數(shù)個像素塊的集合,而像素塊也就是立方體。關(guān)于新建立方體,這個大家已經(jīng)非常熟練了,不僅能新建一個立方體,甚至能新建要多少有多少的立方體。

新建正方體

但目前并不能用手新建,所以接下來添加一個快捷方式Ctrl+N來快速創(chuàng)建立方體。當(dāng)按下Ctrl+N時效果為

這對于已經(jīng)能生成一排立方體的人來說絕對是小意思了,首先在構(gòu)造函數(shù)中綁定快捷方式

public MainWindow()
{
    InitializeComponent();
    KeyDown += MainWindow_KeyDown;
}

MainWindow_KeyDown定義為

private void MainWindow_KeyDown(object sender, KeyEventArgs e)
{

    if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && Keyboard.IsKeyDown(Key.N))
    {
        MeshGeometry3D mesh = MakeCubeMesh(0, 0, 0, 1);
        Color color = Color.FromArgb(255, 0, 255, 0);
        DiffuseMaterial material = new DiffuseMaterial(new SolidColorBrush(color));
        GeometryModel3D model = new GeometryModel3D(mesh, material);
        group3d.Children.Add(model);
    }
}

其中MakeCubeMesh為自定義的函數(shù),早在本系列第一篇博客就已經(jīng)寫過了,其他諸如光效等亦然。唯一的區(qū)別是這次并不一開始就生成多個立方體,所以無需DefineModel函數(shù)。

設(shè)置立方體位置

剛剛雖然新建了一個立方體,但并不能確定立方體的位置,接下來就要新建一個對話框,用以設(shè)置新建立方體的位置。

右鍵項目,新建窗口,名為ParaDialog,其xaml為

<Window x:Class="MyWord.ParaDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="輸入?yún)?shù)" Height="180" Width="300">
    <DockPanel LastChildFill="True">
        <StackPanel DockPanel.Dock="Bottom"
            Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Content="設(shè)置" Click="okButton_Click" Margin="5" Width="60" Height="25"/>
            <Button Content="取消" IsCancel="True" Margin="5" Width="60" Height="25"/>
        </StackPanel>
        <UniformGrid Columns="1" Margin="5" x:Name="ufgLabel"/>
        <UniformGrid Columns="1" Margin="5" x:Name="ufgTextBox"/>

???????    </DockPanel>
</Window>

其cs的核心代碼為

public partial class ParaDialog : Window
{
    static readonly string[] labels = new string[4] { "x坐標(biāo)", "y坐標(biāo)", "z坐標(biāo)", "邊長" };
    List<TextBox> paraBoxes = new List<TextBox>();
    public double[] para;
    public ParaDialog(double[] para)
    {
        this.para = para;
        InitializeComponent();
        string tmp;
        for (int i = 0; i < 4; i++)
        {
            //向UniformGrid中歐給填充文字塊
            ufgLabel.Children.Add(new TextBlock() { Text = labels[i] });
            paraBoxes.Add(new TextBox());
            ufgTextBox.Children.Add(paraBoxes[i]);
        }
    }

    private void okButton_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 4; i++)
            para[i] = double.Parse(paraBoxes[i].Text);
        DialogResult = true;
    }
}

最后,更改Ctrl+N的響應(yīng)代碼

//...前面不用改
if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) && Keyboard.IsKeyDown(Key.N))
{
  double[] para = new double[4];
  ParaDialog pDialog = new ParaDialog(para);
  pDialog.ShowDialog();
  if (pDialog.DialogResult != true)
      return;
  MeshGeometry3D mesh = MakeCubeMesh(para[0],para[1],para[2],para[3]);
  //...后面不用改
}

選中立方體

若想操作幾何體,前提是選中它,接下來就綁定一個鼠標(biāo)動作,來完成選中的操作,先更改xaml代碼,將Viewport3D放到一個border中

<Border Name="mainBorder" Background="White" MouseDown="mainBorder_MouseDown">
    <Viewport3D x:Name="v3dMain">
    </Viewport3D>
</Border>

然后新建mainBorder_MouseDown函數(shù)

private void mainBorder_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Released) return;

    Color color = Color.FromArgb(255, 0, 255, 0);
    var material = new DiffuseMaterial(new SolidColorBrush(color));

    //獲取鼠標(biāo)在對象中的位置
    Point mousePos = e.GetPosition(v3dMain);

    // 執(zhí)行點擊操作
    HitTestResult result = VisualTreeHelper.HitTest(v3dMain, mousePos);

    //此即鼠標(biāo)點擊到曲面上的結(jié)果
    var meshResult = result as RayMeshGeometry3DHitTestResult;
    GeometryModel3D model = null;
    if ((meshResult != null) && (meshResult.ModelHit is GeometryModel3D))
        model = meshResult.ModelHit as GeometryModel3D;

    //如果剛才選了別的模型,則使之恢復(fù)綠色
    if (SelectedModel != null)
        SelectedModel.Material = material;
    //選擇新的模型
    SelectedModel = model;
    if (model != null) 
        model.Material = new DiffuseMaterial(Brushes.Fuchsia);
}

其效果為

挪動幾何體

既然已經(jīng)可以選中了,那么挪動什么的絕對就是小意思了。

回顧此前的鼠標(biāo)操作攝像機,其基本流程是,鼠標(biāo)點擊之后,綁定另一個函數(shù),當(dāng)松開鼠標(biāo)時解綁。

在WPF 3D中,提供了Tranform成員,可用于移動幾何體,所以在新建幾何體時,務(wù)必注意添加一行

//MainWindow_KeyDown函數(shù)
model.Transform = new TranslateTransform3D(0, 0, 0);

然后添加全局變量用以保存舊的位置

private Point3D oldPoint;

然后修改mainBorder_MouseDown,其實只需在末尾添加

mainBorder.CaptureMouse();
mainBorder.MouseMove += MainBorder_MouseMove;
mainBorder.MouseUp += MainBorder_MouseUp;

接下來是鼠標(biāo)挪動和彈起時的動作,其中彈起時非常簡單,無非是解綁鼠標(biāo)動作;而鼠標(biāo)挪動時,則需更改幾何體的變化參數(shù)。

private void MainBorder_MouseUp(object sender, MouseButtonEventArgs e)
{
    mainBorder.ReleaseMouseCapture();
    mainBorder.MouseMove -= MainBorder_MouseMove;
    mainBorder.MouseUp -= MainBorder_MouseUp;
}

private void MainBorder_MouseMove(object sender, MouseEventArgs e)
{
    Point newPoint = e.GetPosition(mainBorder);
    var res = VisualTreeHelper.HitTest(v3dMain, newPoint);
    if (res == null) return;
    var newResult = res as RayMeshGeometry3DHitTestResult;

    var deltaPt = newResult.PointHit - oldPoint;
    var trans = SelectedModel.Transform as TranslateTransform3D;
    trans.OffsetX += deltaPt.X;
    trans.OffsetY += deltaPt.Y;
    trans.OffsetZ += deltaPt.Z;
    oldPoint = newResult.PointHit;
}

效果為

以上就是C# WPF實現(xiàn)3D操作幾何體效果的詳細(xì)內(nèi)容,更多關(guān)于C# WPF 3D操作幾何體的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SuperSocket入門--Telnet服務(wù)器和客戶端請求處理

    SuperSocket入門--Telnet服務(wù)器和客戶端請求處理

    本文的控制臺項目是根據(jù)SuperSocket官方Telnet示例代碼進(jìn)行調(diào)試的,官方示例代碼:Telnet示例。下面跟著小編一起來看下吧
    2017-01-01
  • C#警惕匿名方法造成的變量共享實例分析

    C#警惕匿名方法造成的變量共享實例分析

    這篇文章主要介紹了C#警惕匿名方法造成的變量共享,以實例形式分析了C#的匿名方法造成變量共享的原因及對應(yīng)的解決方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • c# 如何更簡單的使用Polly

    c# 如何更簡單的使用Polly

    這篇文章主要介紹了c# 如何更簡單的使用Polly,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • c# 從IE瀏覽器獲取當(dāng)前頁面的內(nèi)容

    c# 從IE瀏覽器獲取當(dāng)前頁面的內(nèi)容

    從IE瀏覽器獲取當(dāng)前頁面內(nèi)容可能有多種方式,今天我所介紹的是其中一種方法?;驹恚寒?dāng)鼠標(biāo)點擊當(dāng)前IE頁面時,獲取鼠標(biāo)的坐標(biāo)位置,根據(jù)鼠標(biāo)位置獲取當(dāng)前頁面的句柄,然后根據(jù)句柄,調(diào)用win32的東西進(jìn)而獲取頁面內(nèi)容。感興趣的朋友可以參考下本文
    2021-06-06
  • C#圖片處理3種高級應(yīng)用

    C#圖片處理3種高級應(yīng)用

    本文介紹C#圖片處理高級應(yīng)用,這些功能并無多大技術(shù)含量。全部基于.Net Framework類庫完成,代碼中包含了C#圖片處理的一些基礎(chǔ)知識,與大家分享,個人能力有限,不足之處還請及時指正。
    2015-10-10
  • 使用C#開源文件實時監(jiān)控工具Tail&TailUI介紹

    使用C#開源文件實時監(jiān)控工具Tail&TailUI介紹

    本篇文章小編為大家介紹,使用C#開源文件實時監(jiān)控工具Tail&TailUI介紹。需要的朋友參考下
    2013-04-04
  • C#實現(xiàn)IDisposable接口釋放非托管資源

    C#實現(xiàn)IDisposable接口釋放非托管資源

    這篇文章主要為大家介紹了C#實現(xiàn)IDisposable接口釋放非托管資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • unity使用鏈表實現(xiàn)貪吃蛇游戲

    unity使用鏈表實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了unity使用鏈表實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 深入解析C#編程中struct所定義的結(jié)構(gòu)

    深入解析C#編程中struct所定義的結(jié)構(gòu)

    這篇文章主要介紹了C#編程中struct所定義的結(jié)構(gòu),與C++一樣,C#語言同時擁有類和結(jié)構(gòu),需要的朋友可以參考下
    2016-01-01
  • 基于WPF實現(xiàn)3D畫廊動畫效果的示例代碼

    基于WPF實現(xiàn)3D畫廊動畫效果的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于WPF實現(xiàn)簡單的3D畫廊動畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02

最新評論

河津市| 门头沟区| 玉溪市| 阿拉尔市| 襄垣县| 泌阳县| 娄底市| 册亨县| 龙岩市| 郓城县| 葫芦岛市| 南华县| 应用必备| 清徐县| 麻城市| 黔东| 利川市| 昭苏县| 湘乡市| 娱乐| 嘉义县| 内丘县| 屯门区| 分宜县| 石门县| 唐河县| 荥阳市| 德保县| 公主岭市| 河源市| 揭阳市| 邢台市| 东源县| 河间市| 新田县| 渑池县| 阳谷县| 凤凰县| 兰溪市| 广宁县| 微博|