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;

}

时间: 2024-12-29 07:16:41

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

WPF动态加载Menu菜单

有一个项目动态加载wpf的菜单控件可以非常有效的做到更具用户权限显示或控制MenuItem菜单,如何实现这种功能,其实也非常简单. 首先需要了解Wpf的menu菜单控件,她的结构其实也非常简单 <Menu DockPanel.Dock="Top" Name="MenuOptionGroup">   <MenuItem Header="菜单1">   <MenuItem Header="内容1"&g

unity 3D里有两种动态加载机制

unity 3D里有两种动态加载机制: 一是Resources.Load: 一是通过AssetBundle: 其实两者本质上没有什么区别.Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的.其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了. 1.    AssetBundles是什么? 在一些大型的网络游戏,或者加载比较多的一些场景时,如果要等

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

好久没写Blogs了,现在在看[WPF编程宝典],决定开始重新写博客,和大家一起分享技术. 在编程时我们常希望界面是动态的,可以随时变换而不需要重新编译自己的代码. 以下是动态加载XAML的一个事例代码. 在debug文件夹下新建一个文本文件,重命名为:file.xaml 插入界面代码: <DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Button Name=

WPF 仪表盘 刻度盘 动态 加载中 开源

原文:WPF 仪表盘 刻度盘 动态 加载中 开源 1. 表盘 参数可以设置, codeproject上写的.网址在这里. 源码里有demo,很详细. 源码在这里. 2. 动态Loading 截图效果跟实际有点不一样. 自己把源码写成 资源就好用了呗 地址在这里 3.  有两个类似的                              地址1  地址2 原文地址:https://www.cnblogs.com/lonelyxmas/p/9689224.html

虚幻4的关卡动态加载机制

对于大型游戏MMORPG游戏或是3D街景(虚拟现实)还有大型无缝地图都需要地图啊,关卡动态加载的机制来达到让用户感觉自己一直是在漫游,而不会出现Loading(读条),卡界面等情况.当然除非是垮区域无法依靠关卡和关卡中之间的关系做处理. UnrealEngine4 作为一个多年处于世界前矛的商业引擎,自然而然也为大家考虑到这个这种硬性需求.UnrealEngine4 中的动态加载大概分为3种. 首先需要明确下几点概念.因为再同学们信息会等的前提下才会更有利于理解和相互交流.好了,不瞎扯了进入正题

UNITY如何动态加载R素材?

Daydream/Unity技術: Unity动态加载R素材-- 使用ScriptableObject和AssetBoudle by 高煥堂 一.背景说明:   如果您还不熟悉R素材与A素材,请您参阅:Real素材的有机次序.   大约半年前,我为了想参与与HTC 的Vive X加速器计划而设计了<VR+医疗MRI行业平台>.<R素材>概念和名词也是我当时提出的.这样的<VR行业平台>架构也适合于建立特性产业的素材和App平台.例如,台湾的莺歌镇是陶瓷/琉璃设计小城,台

Unreal4 入门(关卡动态加载)

对于大型游戏MMORPG游戏或是3D街景(虚拟现实)还有大型无缝地图都需要地图啊,关卡动态加载的机制来达到让用户感觉自己一直是在漫游,而不会出现Loading(读条),卡界面等情况.当然除非是垮区域无法依靠关卡和关卡中之间的关系做处理. UnrealEngine4 作为一个多年处于世界前矛的商业引擎,自然而然也为大家考虑到这个这种硬性需求.UnrealEngine4 中的动态加载大概分为3种. 首先需要明确下几点概念.因为再同学们信息会等的前提下才会更有利于理解和相互交流.好了,不瞎扯了进入正题

Win8 Metro动态加载内容框架

制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 2012年10月第一次:因为SVG性能问题,将SVG换为cocos2d-x JSBind,可惜cocos2d-x JSBind不完善,最后换为cocos2d-x html5.11月第二次:cocos2d-x html5性能问题,破产.12月第三次:取消HTML5,转为使用XAML+JS模式. (微软

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

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