WPF疑难杂症之一(3D场景)
最近2个月一直在学习WPF,在实际的开发中遇到下面一个3D场景有关的问题,我先给出问题代码:
首先是在资源中定义了一个3D变换组:
<Window x:Class="Viewer3D.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Viewer3D"
<Window.Resources>
<!--Add a Transform resource-->
<Transform3DGroup x:Key="Trans3D">
//这里省略若干代码
</Transform3DGroup>
</Window.Resources>
然后建立一个Viewport3D,其中包含有多个的3D模型:(不包括红色代码)
<Viewport3D Name="View3D">
<!-- Add a camera. -->
<Viewport3D.Camera>
<PerspectiveCamera ....../>
</Viewport3D.Camera>
<!-- Add a model. -->
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup Transform="{StaticResource Trans3D}">
<AmbientLight Color="White"/>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-1 -1 0 1 -1 0 1 1 0 -1 1 0"
Normals="0 0 1 0 0 1 0 0 1 0 0 1"
TextureCoordinates="-1 1 0 1 0 0 -1 0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
<!--添加一个3D模型 Material.-->
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="E:\2.jpg"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
</GeometryModel3D>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D
Positions="-0.5 -0.5 0 0.5 -0.5 0 0.5 0.5 0 -0.5 0.5 0"
Normals="0 0 1 0 0 1 0 0 1 0 0 1"
TextureCoordinates="0 0.5 0.5 0.5 0.5 0 0 0"
TriangleIndices="0 1 2 0 2 3"/>
</GeometryModel3D.Geometry>
<!--Add a image material.-->
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="E:\2.jpg"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Transform>
<TranslateTransform3D
OffsetX="-0.2" OffsetY="0.1" OffsetZ="-0.5" >
</TranslateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
我在场景中添加了两个图片,并给ModelGroup应用了资源中的3D变换。最后的效果如下:
但是这个效果图片中出现了一个非常奇怪的问题,大家可以看小图中有向左倾斜的条纹出现。这不是我期望的结果。最后通过多次的试验发现图像的TranslateTransform对此有影响,但是我上面的3D变换中没有用到TranslatsForm,只是使用了旋转变换和坐标大小的映射。最后不得已在GeometryModel3D添加了一个TranslatsForm解决问题(红色显示的代码)。现在感觉仍很是纳闷,真正的原因还有待进一步探索!
WPF疑难杂症之一(3D场景)的更多相关文章
- 使用WPF实现3D场景[二]
原文:使用WPF实现3D场景[二] 在上一篇的文章里我们知道如何构造一个简单的三维场景,这次的课程我将和大家一起来研究如何用代码,完成对建立好了的三维场景的观察. 首先看一下DEMO的界面: ...
- 使用WPF实现3D场景[一]
原文:使用WPF实现3D场景[一] 在这篇文章里,将介绍如何实现一个简单的三维场景,一个三维的空间,包括空间内的三维物体的组合. 首先介绍一下一个三维场景里的基本元素: 先是定义一个简单的三维的场景环 ...
- WPF中的3D特性和常见的几个类
原文:WPF中的3D特性和常见的几个类 WPF 3D 常用的几个类及其关系 1. Visual 类 所有二维可视化元素的基类,为 WPF 中的呈现提供支持,其中包括命中测试.坐标转换和边界 ...
- 3D场景中的鼠标响应事件
原文:3D场景中的鼠标响应事件 今天要讲的是3D场景中的鼠标响应事件的处理,首先Button的响应是大家熟知的,只要加上一个click事件,然后写一个响应的处理时间就行了.对于二维平面上的一些控件也很 ...
- 在WPF中添加3D特性
原文:在WPF中添加3D特性 35.4 在WPF中添加3D特性 本节介绍WPF中的3D特性,其中包含了开始使用该特性的信息. 提示: WPF中的3D特性在System.Windows.Media.M ...
- OSG 3D场景渲染编程概述
OSG是Open Scene Graphic的缩写,是基于C++平台的使用OpenGL技术的开源3D场景开发. vs环境安装或者是在Ubuntu中环境的安装网上教程很多,都是大同小异的,认真操作容易成 ...
- Python>>>创建一个简单的3D场景
首先安装PyOpengl pip install PyOpenGL PyOpenGL_accelerate
- UI和3D场景同时都需要响应触摸事件
比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分.为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上. 以前NGUI的时候都是自己 ...
- Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景
Seen.js 渲染3D场景为 SVG 或者 HTML5 画布.Seen.js 包含对于 SVG 和 HTML5 Canvas 元素的图形功能的最简单的抽象.所有这个库的其它组件都是不用关心将要渲染的 ...
随机推荐
- 用JetBrains PyCharm 2017.2创建运行Django程序
在JetBrains PyCharm 2017.2里选择 文件(F) 新项目 点击 三角形 运行 修改Urls.py """S14Djngo URL Configur ...
- TZ_13_微服务场景Eureka
1.搭建Eureka的注册中心 1.1Eureka几个时间间隔配置详解 1 >客户端信息上报到eureka服务的时间周期,配置的值越小,上报越频繁,eureka服务器应用状态管理一致性越高 #客 ...
- jnhs-java实体类的有参构造器 无参构造器Could not instantiate bean class 实体类No default constructor found
new一个对象的时候要用到构造函数, 例如Hello hello = new Hello();这时调用的是Hello的无参数构造方法; Hello hello = new Hello("hi ...
- Dijkstra,floyd,spfa三种最短路的区别和使用
这里不列举三种算法的实现细节,只是简单描述下思想,分析下异同 一 Dijkstra Dijkstra算法可以解决无负权图的最短路径问题,只能应付单源起点的情况,算法要求两个集合,开始所有点在第二个集合 ...
- 【洛谷】P1427 小鱼的猜数游戏
P1427 小鱼的数字游戏 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0 ...
- 洛谷P1650 赛马[2017年5月计划 清北学堂51精英班Day1]
P1650 赛马 题目描述 我国历史上有个著名的故事: 那是在2300年以前.齐国的大将军田忌喜欢赛马.他经常和齐王赛马.他和齐王都有三匹马:常规马,上级马,超级马.一共赛三局,每局的胜者可以从负者这 ...
- 关于Layui 响应式移动端轮播图的问题
用layui做轮播图,在手机上宽度异常, 可通过以下方法解决, 不喜欢layui的同学可以选择Swiper // 轮播图 layui.use('carousel', function () { var ...
- Android的ADB学习笔记
1.ADB的常用命令 Pull命令:adb -e|-d pull {文件的路径} {获取文件路径} 2. 文件操作的基本命令 ls -al:显示当下目录下用户对文件的操作权限. = la -al ...
- Django与HTML业务基本结合--基本的用户名密码提交方法1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何让div处于body居中的状态
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8&qu ...