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

原文: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;
       
}

 

时间: 2025-01-27 02:13:29

WPF动态加载3D&nbsp;放大-旋转-平移的相关文章

WPF动态加载程序集

问题描述 WPF动态加载的程序集如果是窗体可以直接运行:假如把运行的窗体关闭后,它在AppDomain中还是存在的,那么下次加载的时候就可以根据名称直接打开运行:我想知道的是怎么防止程序集同时运行多次?(就是防止同一个窗体打开多次,在AppDomain中如何防止)PS:不要说什么模态窗体 解决方案 解决方案二:单例解决方案三:一般都是运行之前遍历已经存在的进程这种方法很不靠谱,强烈要求微软从底层实现这个功能解决方案四:在Application.Current.Windows中判断窗体名称,如果存

WPF MVVM模式动态加载用户控件的问题

问题描述 有这样一个场景,主窗体(MainWwindow)上有4个Button,点击每个Button都会加载一个UserControl(关闭正在打开的)每个UserControl绑定了自己的ViewModel那么MainWindow的ViewModel里,用什么方式加载UserControl?最好是不要在MainWwindow.cs里写代码: 解决方案 解决方案二:写一个方法根据点击不同的button返回不同的UserControl.解决方案三:引用楼主qq_25876223的回复: 有这样一个

动态加载-怎么才能让script生效?

问题描述 怎么才能让script生效? 这个script代码实现图片放大缩小的功能,但是把script放到<?php the_content()?>之后就不管用了,为什么?是因为<?php the_content()?>是动态的原因吗,求解决方法.<?php the_content()?>是动态加载内容的函数~ 解决方案 你的内容里面的图片有zoomout这个样式没有,自己检查..因为你选择器就是选择了图片并且样式为zoomout的

携程Android App的插件化和动态加载框架

携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实现细节,回顾携程Android App的架构演化过程,期望我们的经验能帮助到更多的Android工程师. 需求驱动 2014年,随着业务发展需要和携程无线部门的拆分,各业务产品模块归属到各业务BU,原有携程无线App开发团队被分为基础框架.酒店.机票.火车票等多个开发团队,从此携程App的开发和发布

在Unity3D的网络游戏中实现资源动态加载

用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游戏的过程中,不影响操作的情况下,后台加载剩余的资源,直到所有加载完毕.  本文包含一些代码片段讲述实现这个技术的一种方法.本方法不一定是最好的,希望能抛砖引玉.代码是C#写的,用到了Json,还有C#的事件机制.  在讲述代码之前,先想象这样一个网络游戏的开发流程.首先美工制作场景资源的3D建模,游

[Unity3D]网游中实现资源动态加载 。。手游消减内存必备。。。

用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游戏的过程中,不影响操作的情况下,后台加载剩余的资源,直到所有加载完毕. 本文包含一些代码片段讲述实现这个技术的一种方法.本方法不一定是最好的,希望能抛砖引玉.代码是C#写的,用到了Json,还有C#的事件机制. 在讲述代码之前,先想象这样一个网络游戏的开发流程.首先美工制作场景资源的3D建模,游戏设

[unity3d]从服务器端获取资源动态加载到场景

我们的游戏制作完发布出去提供给玩家,为了给玩家带来更好的游戏体验,要做各种的优化以及设计,首先,游戏资源的加载就是一个非常重要的方面(尤其是网页游戏).由于我们的游戏资源比较大,不能一下全部加载出来,如果是这样,可能会造成玩家长时间的等待.所以我们应该采取动态加载的方式,让玩家在玩游戏的过程中来一点一点从服务器加载游戏资源.要实现这样的效果,首先就必须要制作用于一点点加载的游戏资源. (注:本文只是谈及这些游戏资源的制作和下载,关于游戏运行中的动态加载不做讨论) (再注:本文涉及到的代码都是以C

3 模型-Delphi操作3D模型,加载3D模型

问题描述 Delphi操作3D模型,加载3D模型 请教:Delphi用什么操作3D模型? 我有后缀名是.max的3D的汽车模型,想通过Delphi加载到软件里,加载后可以旋转汽车模型,鼠标点击模型的某个部分,可以知道是哪个部分:比如点击了模型的左前门部分,告诉我 这是左前门即可. 大家谁有好的解决方案?

《AR与VR开发实战》——第3章 AR内容交互 3.1 动态加载AR模型

本节书摘来自华章出版社<AR与VR开发实战>一书中的第章,第3.1节,作者 张克发 赵兴 谢有龙,更多章节内容可以访问"华章计算机"公众号查看. 3.1 动态加载AR模型 在第2章中我们实现了通过Vufoira默认方式识别并显示三维模型.默认的加载模型是通过将3D物体直接放置在场景中并作为识别目标的子物体来实现的,这种实现方式的问题是,当场景中有很多识别目标后,需要一次性加载的模型内容会占用很大的内存.因此,在实际项目案例中需要动态加载识别目标对应的模型,在识别丢失之后删除