中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#?WPF如何實現3D操作幾何體效果

發布時間:2023-03-02 11:28:51 來源:億速云 閱讀:189 作者:iii 欄目:開發技術

本篇內容介紹了“C# WPF如何實現3D操作幾何體效果”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

操作幾何體

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

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

新建正方體

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

C#?WPF如何實現3D操作幾何體效果

這對于已經能生成一排立方體的人來說絕對是小意思了,首先在構造函數中綁定快捷方式

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為自定義的函數,早在本系列第一篇博客就已經寫過了,其他諸如光效等亦然。唯一的區別是這次并不一開始就生成多個立方體,所以無需DefineModel函數。

設置立方體位置

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

右鍵項目,新建窗口,名為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="輸入參數" Height="180" Width="300">
    <DockPanel LastChildFill="True">
        <StackPanel DockPanel.Dock="Bottom"
            Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Content="設置" 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坐標", "y坐標", "z坐標", "邊長" };
    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的響應代碼

//...前面不用改
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]);
  //...后面不用改
}

C#?WPF如何實現3D操作幾何體效果

選中立方體

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

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

然后新建mainBorder_MouseDown函數

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));

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

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

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

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

其效果為

C#?WPF如何實現3D操作幾何體效果

挪動幾何體

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

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

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

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

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

private Point3D oldPoint;

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

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

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

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如何實現3D操作幾何體效果

“C# WPF如何實現3D操作幾何體效果”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

wpf
AI

忻州市| 板桥市| 锦州市| 嘉善县| 寻甸| 平舆县| 太仓市| 昌都县| 通许县| 永平县| 阜平县| 浙江省| 玉林市| 镇宁| 玛纳斯县| 西乌珠穆沁旗| 太原市| 乐平市| 治县。| 双柏县| 湟源县| 陇南市| 巴中市| 新兴县| 临泉县| 张家口市| 通榆县| 牙克石市| 柳林县| 江油市| 石台县| 清涧县| 浦东新区| 乐都县| 上虞市| 石林| 和林格尔县| 伊吾县| 阿克苏市| 齐齐哈尔市| 饶平县|