原文:WPF动态加载3D 放大-旋转-平移

WavefrontObjLoader.cs

第二步:ModelVisual3DWithName.cs

public class ModelVisual3DWithName:ModelVisual3D

    {

       
public string Name { get; set; }

public object Tag { get; set; }

}

第三步:MainWindow.xmal

<Grid x:Name="lay">

   
 <Viewport3D x:Name="vp"
Margin="0">

   
  <Viewport3D.Camera>

<PerspectiveCamera
FieldOfView="45" FarPlaneDistance="100"
LookDirection="0,0,-3.4142135623731" NearPlaneDistance="0.1"
Position="0,0,3.4142135623731"
UpDirection="0,3,0"/>

   
  </Viewport3D.Camera>

</Viewport3D>

       
<Slider Height="23" HorizontalAlignment="Left"
Margin="220,288,0,0" Name="slider1" VerticalAlignment="Top"
Width="100" Maximum="2000" />

       
<Slider Height="23" HorizontalAlignment="Left"
Margin="49,288,0,0" Name="slider2" VerticalAlignment="Top"
Width="100" Maximum="1000" />

       
<Slider Height="23" HorizontalAlignment="Left"
Margin="367,288,0,0" Name="slider3" VerticalAlignment="Top"
Width="100" Minimum="200" Maximum="2000" />

       
<Slider Height="23" HorizontalAlignment="Left"
Margin="567,288,0,0" Name="slider4" VerticalAlignment="Top"
Width="100" Minimum="200" Maximum="2000" />

   
</Grid>

第四步:MainWindow.xmal

PerspectiveCamera myPCamera;

       
DirectionalLight myDirectionalLight;

       
Model3DGroup myModel3DGroup;

       
WavefrontObjLoader wfl;

       
ModelVisual3DWithName mv3dw;

       
public MainWindow()

       
{

           
InitializeComponent();

           
wfl = new
WavefrontObjLoader();           
slider1.ValueChanged += new
RoutedPropertyChangedEventHandler<double>(slider1_ValueChanged);

slider2.ValueChanged += new
RoutedPropertyChangedEventHandler<double>(slider2_ValueChanged);

slider3.ValueChanged += new
RoutedPropertyChangedEventHandler<double>(slider3_ValueChanged);

slider4.ValueChanged += new
RoutedPropertyChangedEventHandler<double>(slider4_ValueChanged);

createCamera();

           
createLight();

           
createModel3D();

           
create360();

           
//createAnimation();

       
}

       
#region //光源

       
private void createLight()

       
{

           
myDirectionalLight = new DirectionalLight();

           
myDirectionalLight.Color = Colors.White;

           
myDirectionalLight.Direction = new Vector3D(-0.61, -0.5,
-0.61);

       
}

       
#endregion

       
#region //摄像机

       
private void createCamera()

       
{

           
myPCamera = new PerspectiveCamera();

           
//myPCamera.Position = new Point3D(0,-1743,-4000);//看的方向

           
myPCamera.Position = new Point3D(0, 0, 1000);

           
myPCamera.LookDirection = new Vector3D(0,0,-1000);//摄影机看的方向

           
myPCamera.UpDirection = new Vector3D(0, 1, -0);

           
myPCamera.FieldOfView = 45;//法向量
摄影机上下颠倒,左转右转           
myPCamera.NearPlaneDistance = 0.1;

           
myPCamera.FarPlaneDistance = 11050;

vp.Camera = myPCamera;

       
}

       
#endregion

       
#region //模型

       
private void createModel3D()

       
{

           
myModel3DGroup = new Model3DGroup();

           
myModel3DGroup.Children.Add(myDirectionalLight);

var m =
wfl.LoadObjFile(@"C:/Users/Adminstrator/Desktop/3D动态加载/WpfApplication2/xx.obj");

m.Content = myModel3DGroup;

vp.Children.Add(m);

       
}

       
#endregion

       
#region //360旋转动作

       
RotateTransform3D rtf3D;

       
AxisAngleRotation3D aar;

       
private void create360()

       
{

           
rtf3D = new
RotateTransform3D();

aar = new AxisAngleRotation3D();

           
this.RegisterName("myAngleRotation", aar);

           
aar.Angle = 0;

           
aar.Axis = new Vector3D(0, 3, 0);

           
rtf3D.Rotation = aar;

           
myModel3DGroup.Transform = rtf3D;

           
myPCamera.Transform = rtf3D;

       
}

       
Storyboard sbd;

       
DoubleAnimation dan;

       
private void createAnimation()

       
{

           
sbd = new Storyboard();

           
dan = new DoubleAnimation(0,360,new
Duration(TimeSpan.FromSeconds(10)));

           
dan.RepeatBehavior = RepeatBehavior.Forever;

           
Storyboard.SetTargetName(dan,"myAngleRotation");

           
Storyboard.SetTargetProperty(dan, new
PropertyPath(AxisAngleRotation3D.AngleProperty));

           
sbd.Children.Add(dan);

           
sbd.BeginTime = TimeSpan.FromSeconds(5);//开始时间

           
sbd.Begin(this);

       
}

       
#endregion

       
void slider1_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double>
e)

       
{

           
myPCamera.Position = new Point3D(slider1.Value , slider2.Value,
slider3.Value);

       
}

       
void slider2_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double>
e)

       
{

           
myPCamera.Position = new Point3D(slider1.Value, slider2.Value,
slider3.Value);

       
}

       
void slider3_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double>
e)

       
{

           
myPCamera.Position = new Point3D(slider1.Value, slider2.Value,
slider3.Value);

       
}

       
void slider4_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double>
e)

       
{

           
aar.Angle = slider4.Value;

       
}

WPF动态加载3D 放大-旋转-平移的更多相关文章

  1. WPF动态加载3D 放大-旋转-平移

    第一步:新建WavefrontObjLoader.cs using System; using System.Collections.Generic; using System.Windows; us ...

  2. WPF 动态加载主题由zip

    经典主题的方式 主题战略 加载速度 本机支持 (不需要额外的代码) 支持代码为主题 (捆绑代码 & 资源成单独的文件) 支持资源层次结构中导航 动态加载 动态卸载 轻松地编辑和编译 (不需要安 ...

  3. WPF 3D动态加载模型文件

    原文:WPF 3D动态加载模型文件 这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子. 一般来说关于WPF使用3D的例子,都是下面的流程: 1.美工用3DMAX做好模型,生成一 ...

  4. [WPF学习笔记]动态加载XAML

    好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代 ...

  5. mvvm模式下在WPF项目中动态加载项目的程序集和类

    在mvvm模式的wpf项目中有个需求需要去加载解决方案的程序集,并且根据程序集去动态加载当前程序集的类,做成下拉框形式. 效果: //全局定义 private ComboBox abList= nul ...

  6. WPF中动态加载XAML中的控件

    原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...

  7. WPF中Style文件的引用——使用xaml代码或者C#代码动态加载

    原文:WPF中Style文件的引用--使用xaml代码或者C#代码动态加载 WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观 ...

  8. Win8 Metro动态加载内容框架

    制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 ...

  9. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

随机推荐

  1. 无锁队列--基于linuxkfifo实现

    一直想写一个无锁队列,为了提高项目的背景效率. 有机会看到linux核心kfifo.h 原则. 所以这个实现自己仿照,眼下linux我们应该能够提供外部接口. #ifndef _NO_LOCK_QUE ...

  2. [Android学习笔记]EditText的使用

    EditText就是我们最常用的文本输入框 常用属性见官方文档 主要是以下几个问题: 1.取消默认获取焦点 Activity启动时候会把焦点默认停留在第一个EditText控件上 一般的解决方法是在此 ...

  3. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  4. What is tradebit?

    The Tradebit Fact Sheet What is tradebit?

  5. 【矩阵乘】【NOI 2012】【cogs963】随机数生成器

    963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对照 时间限制:1 s 内存限制:128 MB **[问题描写叙述] 栋栋近期迷 ...

  6. expdp时遇到ORA-31693&amp;ORA-02354&amp;ORA-01466

    expdp时遇到ORA-31693&ORA-02354&ORA-01466 对一个schema运行expdp导出,expdp命令: nohup expdp HQ_X1/HQ_X1 DU ...

  7. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  8. Android -&gt; 怎样避免Handler引起内存泄露

    很多其它内容,可訪问个人博客www.liangfeizc.com 错误代码 假设在Activiy中通过内部类(Runnable)的方式定义了一个变量runnable, final Runnable r ...

  9. IOS 与ANDROID框架及应用开发模式对照一

    IOS 和ANDROID操作系统都是眼下流行的移动操作系统,被移动终端和智能设备大量採用,两者都採用了先进的软件技术进行设计,为了方便应用开发两者都採用了先进的设计模式. 两者在框架设计上都採用了什么 ...

  10. 设计模式学习一:strategyPattern

    #ifndef STRATEGYPATTERN_H_#define STRATEGYPATTERN_H_#include<iostream>using namespace std; //策 ...