using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX;
namespace 包围体
{
public partial class Form1 : Form
{
private Device device = null;
private CustomVertex.PositionTextured[] vertics;//点集合,用来绘制四边形
private float angleY = 0.1f;//绕y轴旋转变量
private Vector3 cameraPosition = new Vector3(8, 15, 8);//摄像机位置
private Vector3 cameraTarget = new Vector3(10, 10, 10);
private Vector3 camereUpVector = new Vector3(0, 1, 0);
private Mesh mesh;
private Material meshMaterial1;
private Material meshMaterial2;
// Texture texture;//图片纹理
/// <summary>
/// 是否暂停
/// </summary>
bool pause = false;
public Form1()
{
InitializeComponent();
} /// <summary>
/// 实例化device,在progress里调用
/// </summary>
/// <returns></returns>
public bool InitializeGraphics()
{
try
{
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;//窗口显示
presentParams.SwapEffect = SwapEffect.Discard;//后备缓存的交换方式
presentParams.EnableAutoDepthStencil = true;//自动深度测试
presentParams.AutoDepthStencilFormat = DepthFormat.D16;//缓冲区单元为16位二进制数
device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
device.DeviceReset += new EventHandler(this.OnResetDevice); this.OnCreateDevice(device, null);
this.OnResetDevice(device, null);
}
catch (DirectXException)
{
return false;
}
return true; }
public void OnResetDevice(object sender, EventArgs e)
{
VertexDeclaration();
device.Lights[0].Type = LightType.Directional;
device.Lights[0].Direction = new Vector3(0, 0, 1);
device.Lights[0].Diffuse = Color.Red;
device.Lights[0].Ambient = Color.Cyan;
device.Lights[0].Enabled = true;
device.Lights[0].Update();
} public void OnCreateDevice(object sender, EventArgs e)
{
// texture = TextureLoader.FromFile(device, "..\\..\\CTGU.jpg");
device.SamplerState[0].MagFilter = TextureFilter.Anisotropic;
mesh = Mesh.Teapot(device);
meshMaterial1 = new Material();
meshMaterial1.Diffuse = Color.White;
meshMaterial1.Ambient = Color.Green;
meshMaterial2 = new Material();
meshMaterial2.Diffuse = Color.White;
meshMaterial2.Ambient = Color.Blue;
} //生成点集合
private void VertexDeclaration()
{
vertics = new CustomVertex.PositionTextured[4];
vertics[0].Position = new Vector3(9, 9, 10);
vertics[0].Tu = 0;
vertics[0].Tv = 1f;
vertics[1].Position = new Vector3(9, 11, 10);
vertics[1].Tu = 0;
vertics[1].Tv = 0;
vertics[2].Position = new Vector3(11, 11, 10);
vertics[2].Tu = 1f;
vertics[2].Tv = 0;
vertics[3].Position = new Vector3(11, 9, 10);
vertics[3].Tu = 1f;
vertics[3].Tv = 1f;
} //设置视角
private void SetCamera()
{
device.Transform.View = Matrix.LookAtLH(cameraPosition, cameraTarget, camereUpVector);
device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.33f, 1, 10000f);
} public void Render()
{ if (device == null)
{
return;
}
if (pause)
{
return;
}
device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);//第一个参数,指定要初始化目标窗口和深度缓冲区
device.BeginScene();
/**** 开始渲染*************************************************************************/ SetCamera();//改变摄像机位置
device.RenderState.CullMode = Cull.None;
device.RenderState.Lighting = true ;
device.Transform.World = Matrix.Scaling(0.5f, 0.5f, 0.5f) * Matrix.Translation(cameraTarget.X, cameraTarget.Y, cameraTarget.Z);
device.Material = meshMaterial1;
mesh.DrawSubset(0);//绘制茶壶 //绘制包围盒
device.RenderState.FillMode = FillMode.WireFrame;
GraphicsStream gs = mesh.VertexBuffer.Lock(0, 0, LockFlags.None);
Vector3 minVector, maxVector;
Geometry.ComputeBoundingBox(gs, mesh.NumberVertices, mesh.VertexFormat, out minVector, out maxVector);
Mesh Box = Mesh.Box(device, maxVector.X - minVector.X, maxVector.Y - minVector.Y, maxVector.Z - minVector.Z);
// Box.DrawSubset(0); //绘制包围球
Vector3 center = new Vector3();
float radius = Geometry.ComputeBoundingSphere(gs, mesh.NumberVertices, mesh.VertexFormat, out center);
Mesh sphere = Mesh.Sphere(device, radius*100, 100, 100);
device.Material = meshMaterial2;
sphere.DrawSubset(0); // device.Transform.World = Matrix.Identity;
//device.SetTexture(0, texture);
//device.VertexFormat = CustomVertex.PositionTextured.Format;
//device.DrawUserPrimitives(PrimitiveType.TriangleFan, 2, vertics); /****结束渲染*************************************************************************/
device.EndScene();
device.Present();//更新显示缓冲区
}
protected override void OnPaint(PaintEventArgs e)
{
this.Render();
}
protected override void OnKeyDown(KeyEventArgs e)
{
Vector3 lastPosition = cameraPosition;//记录上一次摄像机的位置,即没旋转前的位置!
Vector4 tempV4;
Matrix currentView = device.Transform.View;//当前摄像机的视图矩阵
switch (e.KeyCode)
{
case Keys.Left://y轴旋转++
cameraPosition.Subtract(cameraTarget);//向量相减,得到以目标点为起点的向量
tempV4 = Vector3.Transform(cameraPosition, Matrix.RotationQuaternion(Quaternion.RotationAxis(new Vector3(currentView.M12, currentView.M22, currentView.M32), -angleY)));
cameraPosition.X = tempV4.X + cameraTarget.X;
cameraPosition.Y = tempV4.Y + cameraTarget.Y;
cameraPosition.Z = tempV4.Z + cameraTarget.Z;
break;
case Keys.Right://y轴旋转--
cameraPosition.Subtract(cameraTarget);
tempV4 = Vector3.Transform(cameraPosition, Matrix.RotationQuaternion(Quaternion.RotationAxis(new Vector3(currentView.M12, currentView.M22, currentView.M32), angleY)));
cameraPosition.X = tempV4.X + cameraTarget.X;
cameraPosition.Y = tempV4.Y + cameraTarget.Y;
cameraPosition.Z = tempV4.Z + cameraTarget.Z;
break;
case Keys.Up://x轴旋转++
cameraPosition.Subtract(cameraTarget);
tempV4 = Vector3.Transform(cameraPosition,
Matrix.RotationQuaternion(
Quaternion.RotationAxis(new
Vector3(device.Transform.View.M11
, device.Transform.View.M21, device.Transform.View.M31),
-angleY)));
cameraPosition.X = tempV4.X + cameraTarget.X;
cameraPosition.Y = tempV4.Y + cameraTarget.Y;
cameraPosition.Z = tempV4.Z + cameraTarget.Z;
Vector3 directionV3 = cameraPosition - lastPosition;//旋转方向
camereUpVector = -directionV3;//改变y方向位置
break;
case Keys.Down://x轴旋转--
cameraPosition.Subtract(cameraTarget);
tempV4 = Vector3.Transform(cameraPosition,
Matrix.RotationQuaternion(
Quaternion.RotationAxis(new
Vector3(device.Transform.View.M11
, device.Transform.View.M21, device.Transform.View.M31),
angleY)));
cameraPosition.X = tempV4.X + cameraTarget.X;
cameraPosition.Y = tempV4.Y + cameraTarget.Y;
cameraPosition.Z = tempV4.Z + cameraTarget.Z;
Vector3 direction2V3 = cameraPosition - lastPosition;//旋转方向
camereUpVector = direction2V3;
break;
case Keys.Add://放大,按加号键
cameraPosition.Subtract(cameraTarget);
cameraPosition.Scale(0.95f);
cameraPosition.Add(cameraTarget);
break;
case Keys.Subtract://缩小,减号键
cameraPosition.Subtract(cameraTarget);
cameraPosition.Scale(1.05f);
cameraPosition.Add(cameraTarget);
break;
}
Matrix viewMatrix = Matrix.LookAtLH(cameraPosition, cameraTarget, camereUpVector);
device.Transform.View = viewMatrix;
} private int mouseLastX, mouseLastY;//记录鼠标按下时的坐标位置
private bool isRotateByMouse = false;//记录是否由鼠标控制旋转
private bool isMoveByMouse = false;//记录是否由鼠标控制摄像机 移动 protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mouseLastX = e.X;
mouseLastY = e.Y;
isRotateByMouse = true;
}
else if (e.Button == MouseButtons.Middle)
{
mouseLastX = e.X;
mouseLastY = e.Y;
isMoveByMouse = true;
} } protected override void OnMouseMove(MouseEventArgs e)
{
if (isRotateByMouse)
{
Matrix currentView = device.Transform.View;//当前摄像机的视图矩阵
float tempAngleY = 2 * (float)(e.X - mouseLastX) / this.Width;
cameraPosition.Subtract(cameraTarget);
Vector4 tempV4 = Vector3.Transform(cameraPosition, Matrix.RotationQuaternion(Quaternion.RotationAxis(new Vector3(currentView.M12, currentView.M22, currentView.M32), tempAngleY)));
cameraPosition.X = tempV4.X;
cameraPosition.Y = tempV4.Y;
cameraPosition.Z = tempV4.Z;//旋转y轴得到新的摄像机临时坐标
Vector3 tempCameraPosition = cameraPosition;//记录一下上一次摄像机的位置
float tempAngleX = 4 * (float)(e.Y - mouseLastY) / this.Height;
tempV4 = Vector3.Transform(cameraPosition, Matrix.RotationQuaternion(Quaternion.RotationAxis(new Vector3(currentView.M11, currentView.M21, currentView.M31), tempAngleX)));
if (tempAngleX > 0)//大于零说明x轴左手系中,取负值旋转,因此摄像机向上方向与摄像机移动位置方向相反
{
camereUpVector = new Vector3(-cameraPosition.X + tempV4.X, -cameraPosition.Y + tempV4.Y, -cameraPosition.Z + tempV4.Z);
}
else if (tempAngleX < 0)
{
camereUpVector = new Vector3(cameraPosition.X - tempV4.X, cameraPosition.Y - tempV4.Y, cameraPosition.Z - tempV4.Z);
}
cameraPosition.X = tempV4.X + cameraTarget.X;
cameraPosition.Y = tempV4.Y + cameraTarget.Y;
cameraPosition.Z = tempV4.Z + cameraTarget.Z;
Matrix viewMatrix = Matrix.LookAtLH(cameraPosition, cameraTarget, camereUpVector);
device.Transform.View = viewMatrix;
mouseLastX = e.X;
mouseLastY = e.Y;
} else if (isMoveByMouse)
{
Matrix currentView = device.Transform.View;//当前摄像机的视图矩阵
float moveFactor = 0.01f;
cameraTarget.X += -moveFactor * ((e.X - mouseLastX) * currentView.M11
- (e.Y - mouseLastY) * currentView.M12);
cameraTarget.Y += -moveFactor * ((e.X - mouseLastX) * currentView.M21
- (e.Y - mouseLastY) * currentView.M22);
cameraTarget.Z += -moveFactor * ((e.X - mouseLastX) * currentView.M31
- (e.Y - mouseLastY) * currentView.M32);
Matrix viewMatrix = Matrix.LookAtLH(cameraPosition, cameraTarget, camereUpVector);
device.Transform.View = viewMatrix;
mouseLastX = e.X;
mouseLastY = e.Y;
}
} //鼠标滚轮控制摄像机放大缩小
protected override void OnMouseWheel(MouseEventArgs e)
{
float scaleFactor = -(float)e.Delta / 2000 + 1f;
cameraPosition.Subtract(cameraTarget);
cameraPosition.Scale(scaleFactor);
cameraPosition.Add(cameraTarget);
Matrix viewMatrix = Matrix.LookAtLH(cameraPosition, cameraTarget, camereUpVector);
device.Transform.View = viewMatrix;
}
protected override void OnMouseUp(MouseEventArgs e)
{
isRotateByMouse = false;
isMoveByMouse = false;
}
}
}
----------------------------------------

感谢每一位阅读此篇文章的人,希望可以帮到你。

Directx3d绘制包围体并控制光照效果的更多相关文章

  1. 制作Kinect体感控制小车教程 &lt;一&gt;

    转载请注明出处:http://blog.csdn.net/lxk7280                                        Kinect体感控制小车        Kine ...

  2. U3D学习09-物体简单控制及视角观察

    一.Character Control非刚体 1.场景初始化,注意调整CC的轴心,不需要碰撞,且删除CC子物体的碰撞.2.移动:       获取X,Z轴变化,定义变量h,v:        定义移动 ...

  3. arduino体感控制简单版

    https://learn.sparkfun.com/tutorials/apds-9960-rgb-and-gesture-sensor-hookup-guide/all 硬件连线 关键 VCC=  ...

  4. OpenGL 遮挡查询

    原文地址:http://www.linuxidc.com/Linux/2015-02/114036.htm 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中, ...

  5. OpenGL遮挡查询

    转自:http://www.cnblogs.com/mazhenyu/p/5083026.html 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减 ...

  6. OpenGL超级宝典笔记——遮挡查询 [转]

    目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...

  7. Light Pre-Pass 渲染器----为多光源设计一个渲染器

    http://blog.csdn.net/xoyojank/article/details/4460953 作者: Wolfgang Engel, 原文: http://www.wolfgang-en ...

  8. D3D的绘制

    一.D3D中的绘制 顶点缓存和索引缓存:IDirect3DVertexBuffer9 IDirect3DIndexBuffer 使用这两缓存而不是用数组来存储数据的原因是,缓存可以被放置在显存中,进行 ...

  9. p2 钢体

    钢体可以控制沿x方向移动,沿y方向移动, 不旋转等. fixedX, fixedY, fixedRotaion 1)addBody和removeBody:World类中的addBody()和remov ...

随机推荐

  1. webpack学习之路

    当自己在学习webpack的时候,在网上发现中文的很详细的教程很少,于是便想将自己学习webpack的笔记记录整理下来,便有了这篇文章,希望对大家有所帮助,如果有错误,欢迎大家指出. 在我们开始之前 ...

  2. bzoj 1935: [Shoi2007]Tree 园丁的烦恼

    Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: ...

  3. bzoj:1687;poj 2434:[Usaco2005 Open]Navigating the City 城市交通

    Description A dip in the milk market has forced the cows to move to the city. The only employment av ...

  4. Necklace(树状数组+离线操作)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3874 Necklace Time Limit: 15000/5000 MS (Java/Others) ...

  5. Effective Java 第三版——24. 优先考虑静态成员类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. IntelliJ IDEA 2017.3下载与安装

    大约在2017年暑假的时候知道了IntelliJ IDEA,但是那个时候一心认为有Eclipse就足够用了,然而今天在网上冲浪的时候发现,IntelliJ IDEA是java语言开发的集成环境,这款开 ...

  7. php 下载文件的头信息 Determine Content Type

    <?php if(!function_exists('mime_content_type')) { function mime_content_type($filename) { $mime_t ...

  8. PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别

    HTTP定义了与服务器交互的不同的方法,最基本的是POST.GET.PUT.DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post.get.pu ...

  9. HTML5 Audio/Video 标签,属性,方法,事件汇总 (转)

    标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放controls:浏览器自带的控制条 1 http://www.abc.com/test.mp3&quo ...

  10. WaitForXXX等待无效句柄

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...