文档库 最新最全的文档下载
当前位置:文档库 › DirectX Graphics

DirectX Graphics

DirectX Graphics
DirectX Graphics

DirectX Graphics: Getting Started(开始)

Author : Jack Hoxley

翻译:FOX [EMAIL]

Written : 30th November 2000

Contact : [Email]

Download :Graph_01.Zip [8 Kb]

1. Introduction(介绍)

Welcome to the first lesson of many on DirectX8-Graphics. There are three likely reasons why you're reading this: You're completely new to the world of DirectX and VB, you're interested in upgrading from DirectX 7, you're interested in upgrading from DirectX7, have looked in the DirectX 8 SDK and gotten very confused. Either way you're here.

欢迎进入DirectX8-Graphics部分第一课。你为什么读这篇教程有三个理由:(1)你完全是个DirectX VB新手。(2)你很愿意在DX7的基础上继续学习,但看DirectX 8 SDK感到困惑。(3)前两条理由之一。

The DirectX 8 graphics im plementation is quite different to what you m ay well be used to if you're a veteran of earlier versions; the m ain thing you'll have noticed is that there is no DirectDraw interfaces left. In DirectX 7 it was possible to use 3D (and the hardware accelerator) to generate 2D graphics; it wasn't easy - but it was possible; In DirectX 8 this is the only way to generate 2D graphics. Dont worry about this part if you're new to DirectX com pletely.

假设你以前使用过DirectX,但DirectX 8 graphics组件和你熟悉的DirectX 前几个版本几乎不同。主要的不同是,DirectX 8里面已经没了DirectDraw组件。在DirectX 7里面,3D 可以创建2D图形;这样不是很简单,但是是可行的;在DirectX 8里面只有通过这种方法创建2D图形。不用担心这部分,即使你是个DirectX新手。

DirectX 8 offers us m any incredible features, sadly alot of them are extrem ely com plicated and unlikely to be used by anyone except a professional. Things such as the microprogrammable architecture for per-pixel processing and vertex processing will make games more lifelike; Mesh skinning will make the representations of players m ore realistic and various other features. This site will try to explain as many of these as is possible.

DirectX 8提供给我们很多不可置信的特性,但可惜的是,一部分特性的使用是有很高难度的,业余者几乎没有会使用的可能性,除非专业的人员。一些特性比如,per-pixel混合处理和vertex 混合处理,可以使得游戏更赋色彩化;Mesh skin(骨骼动画)可以使得人物角色的表现更真实并且赋有更多的特性。本教程将尽可能的说明更多细节技术。

If you're a seasoned DirectX 7 programmer you can jump straight to part 2; for those of you not familiar with DirectX - a brief explanation follows. DirectX is a collection of classes and interfaces that allow low-level access to hardware. They get their speed almost entirely from the fact that they are very sim ple and very "thin".

A call to DirectX will get to the hardware much faster than if you use the traditional windows API calls, which go through several stages before appearing to do anything. DirectX also supports alm ost every feature im aginable from the current crop of 3D cards, sound cards, internet connection and input devices; that is until the next batch are released... From a programmers point of view we create an instance of a DirectX com ponent, be it DirectX in general, Direct3D, DirectSound, DirectMusic. Once our application has access to this we can start playing around, initially we'll set the hardware up - in graphics we'll set the display m ode, any rendering options, load textures and geometry. Once we're done with that part we'll enter a tight loop (in most DirectX apps) where we'll update anything that needs updating and usually render the next fram e onto the screen - this is the basis of a fram e rate; a fram e rate of 70 indicates that this loop will be processed 70 tim es a second...

如果你是个老练的DirectX 7程序员,你可以直接跳过本节,进入第二部分学习。下面将简要的介绍一下DirectX;DirectX是所有低级可直接控制硬件的类和接口的集合。但DirectX提高速度不能和难度成正比。调用DirectX将比直接调用传统的windows API快很多。DirectX几乎支持当今市面上主流显卡所有图形特效特性,和声卡特性,并且支持INTERNET连接,提供输入设置支持;从程序员角度来看,我们创建一个DirectX组件实例,Direct3D, DirectSound, DirectMusic等。一旦我们开始入门,就几乎和这些组件打交道。起初,我们将从设置硬件开始,在图形部分,我们将设置显示模式,渲染选项,读取纹理,创建几何网格。当我们完成上面几步我们将开始游戏循环。上面这些就是基本的帧;比如每秒运行70个游戏循环,那意味着FPS

为70帧。

2. Getting Started(开始)

The first part of our DirectX graphics series is to learn how to setup a basic

fram ework. Should you keep with DirectX the code you learn here will be used time and tim e again, eventually you'll probably be able to recite it in your sleep (depending on what sort of person you are!). If you dont follow this code now, you'll be lost later on; go over and over this until you understand it inside out - later lessons will assume that you can set up a basic fram ework.

第一部分将学习用DirectX graphics如何设置个基本框架。你必须坚持把所学的DirectX代码多次反复的学习和研究,否则你将在睡觉中忘掉(这点取决于读者本人)。后面的教程是假设你已经会设置基本框架的。

2a. Attach DirectX8 Library and start our project(加入DirectX8库文件并开始项目)

Start a new project in Visual Basic, Standard EXE will do fine. You should see t hat a single form is added - This should be the norm for you, as it's unwise to venture into DirectX if you have little VB experience. Go to the project m enu and select "references". Scroll down until you find an entry in the list called "DirectX 8 for Visual Basic Type Library" and check the box next to it - then click okay. Save you're project if you want. This project is now fully capable of utilising DirectX 8.

(1)在VB里面创建个“标准的EXE”项目

(2)选择“项目”菜单-》选择“引用”-》向下拉滚动条寻找到“DirectX 8 for Visual Basic Type Library”并且选中。

(3)按“确定”如果需要的话,可以保存。

2b. The Variables(变量)

变量声明部分:

2c. The Initialisation(初始化)

After this part you'll need to initialise your objects, and set som e basic parameters. Nothing com plicated yet, but for now we'll stick to using windowed mode (Not fullscreen, as used by most gam es).

在学完本节后,你将学会如何初始化,并且设置基本的元素,没有任何难点,但是现在我们使用窗口模式(非全屏)

The prototype for this function looks like this:

object.CreateDevice(Adapter As Long, DeviceType As CONST_D3DDEVTYPE, hFocusWindow As Long, BehaviorFlags As Long, PresentationParameters As

D3DPRESENT_PARAMETERS) As Direct3DDevice8

这就是CreateDevice函数原型,在DIRECTX SDK里面可以查找.

Adapter : This is either primary or secondary. D3DADAPTER_DEFAULT always represents the primary adapter; we'll cover the usage of secondary adapters in a later lesson. Basically all they do is switch between a prim ary video card (a standard 2D/3D card) or a secondary card (such as the 3D-only voodoo 1's and 2's)

Adapter :这个参数选择主还是从适配器。D3DADAPTER_DEFAULT参数总是表现为主适配器;我们将是修改适配器类型在第二课。

DeviceType : This basically allows you to choose between the HAL (Hardware Accelerator) and the reference rasterizer (A debugging tool). There is a third option, software rendering, which is designed to allow plugin support for custom renderers; the DirectX DDK (Driver Development Kit) has information on doing this; but if you can write your own 3D renderer you're unlikely to be using VB... :) Specify either D3DDEVTYPE_HAL or D3DDEVTYPE_REF. Bare in mind that if there is no support for the HAL available this call will fail and you wont create a device.

DeviceType :设备类型。这个主要让你选择HAL(使用硬件加速)还是reference(调试)。还有第三项(软件加速),支持直接设置渲染插件。在DirectX DDK有提示如何做,但你像编

写自己的渲染器,你将无法采用VB ;)。指定D3DDEVTYPE_HAL 或者D3DDEVTYPE_REF,如果万一显卡部支持HAL,那函数调用将失败,你将不能创建一个设备。

hFocusWindow : This is just a value that DirectX can use to track your applications status. This value com es from the Form.hWnd value; the value specified m ust be a valid, created form with nothing fancy about it - no circular forms or MDI forms please :)

hFocusWindow :窗口句柄.可以通过“Form.hWnd”来获取这个参数;这个值必须合法。无法使用MDI窗体的句柄。

BehaviorFlags : This just sets how the Direct3D engine processes textures, vertices, lighting and so on. The best option to use here would be

D3DCREATE_PUREDEVICE - but very few graphics cards will support this (even the relatively new TnL GeForce 256 cards), using this option will mean that the 3D card does almost everything - transform ation, shading, lighting, texturing and rasterization. If you can't use this on you're hardware the next best thing will be D3DCREATE_HARDWARE_VERTEXPROCESSING - this uses hardware acceleration as m uch as possible; most recent 3D cards will support this. Failing this you could try D3DCREATE_MIXED_VERTEXPROCESSING which will use hardware when possible, but if the hardware can't handle it then the software com ponents will kick in. Last of all is the plain software rasterizer; should there be no 3D hardware available this is likely to be the only option. It's alm ost always very slow, and not a nice thing to use - should you want to :

D3DCREATE_SOFTWARE_VERTEXPROCESSING.

BehaviorFlags :这个参数设置D3D引擎如何渲染纹理,顶点,灯光等。最奸的参数是采用D3DCREATE_PUREDEVICE,但几乎很少的显卡支持(即使是当今很流行的TnL GeForce 256 卡),用这个参数意味全部图元由显卡进行图像渲染。如果你无法用这一项,下个推荐采用的为D3DCREATE_HARDWARE_VERTEXPROCESSING,大部分的图元将由显卡渲染,市面上流行的显卡基本上都支持这一项。如果D3DCREATE_MIXED_VERTEXPROCESSING 被采用,那意味着硬件和软件加速同时使用(不推荐)。大多显卡就采用这个

D3DCREATE_SOFTWARE_VERTEXPROCESSING.参数,但速度会慢一点。

PresentationParameters : This depicts what display mode you want to use. Pass the current display mode (as we have earlier) and you can use windowed mode; alter these settings (shown later) and you can enter fullscreen mode.

PresentationParameters :这个参数设置显示模式。使用当前的显示模式并且运用窗口模式。全屏模式我们将在后面提到。

3. Rendering(渲染)

主要有下面几步:

1.Update any changes to vertices, Cam ereras, textures etc...

2.Clear the screen - rem oving the last fram es work

3.Draw the new fram e - this is the lengthy part.

4.Update any final variables

5.Copy the rendered image to the screen (Primary.Flip for veteran DirectX7

programmers)

1.修改顶点数据,移动视角矩阵,纹理等

2.清除场景-删除上一帧的图元

3.绘制新的一帧-这是最长的一部分

4.修改最后变量

5.拷贝渲染图形进入屏幕

基本代码:

This code excerpt is very simple, it doesn't draw anything and it doesn't update any variables. But you'll start to see how this changes in later lessons.

这段代码现在是非常的简单,因为没有画任何东西也没修改任何变量。但是你将看到如何改变在下一课程。

4. The Main Loop(主循环)

The m ain loop is basically a sm all piece of code that executes a very tight loop; for every loop we do we'll update the graphics, AI, Sound, Physics (or whatever else the gam e needs to do). The faster this code executes the higher the fram e rate - Sim ple as that. Because of the way a loop operates we can also include the initialisation and termination code in the sam e procedure. It'll look like this:

主循环代码很少,在每个循环里面我们升级图形,调节人工智能,调用声音,和任何游戏需要的东西。越好的代码会使得循环做的越多,那样FPS也越高。

You'll notice that all of this code is in the form load procedure; this'll mean that DirectX is initialised and setup when the application is first loaded, and it'll go straight into the m ain game loop. One immediate thing to remember is that you MUST include the "Me.Show" procedure as one of the very first lines. In the norm al life of a VB application the form isn't displayed until after the Form_Load code is com pleted - but in our case it'll only be com pleted when the application closes. With the "DoEvents" line included the form will eventually be shown, but it wont be very tidy.

你主意到所有代码都在FORM_LOAD过程里面,这也意味着DX的初始化和设置在应用程序初始化的时候就被读取,然后直接进入游戏主循环。一件重要的事情就是你必须记住代码中必须包含"Me.Show"在第一行中。在大部分VB应用中,Form_Load过程代码结束后,窗体就会出现。“DoEvents”是释放点线程,否则CPU占用率将达到100%

The m ain loop structure is based com pletely on a boolean variable, bRunnning, whilst this is set to true the m ain loop is executed. As soon as it turns false we'll leave the loop and continue executing the Form_Load code; which, as you can see, will quickly clean up DirectX (explained later) and close the application. You can think of this variable as an off switch - and the way the loop works it'll respond very quickly; at 60 fram es per second it should respond in 1/60th of a second to your request.

主循环结构基于BOOL变量,当bRunnning=True时候主循环才被运行。BRunnning作为开关作用。

5. Cleaning Up(结束)

6. Extending this sample to use fullscreen mode(全屏模

式)

If you run the sam ple program at this point you'll realise that it's running in windowed m ode (I did tell you as well). Although a lot of gam es have an option for using windowed mode, by default they'll use fullscreen mode. There are many reasons for this, but it's basically down to look and feel - A gam e looks m ore real and feels better if you cant see "My Documents" or the start-bar in the background.

如果你运行这个例子,你会发现这个是窗口模式。虽然很多游戏有“窗口模式”这个选项,但是默认情况往往是全屏模式。有很多理由为什么用全屏,但是最基本的理由是给玩家感觉更自由更真实。

Switching to fullscreen mode isn't very complicated, we just need to re-design our structure slightly:

切换全屏不是很复杂,我们只要修改一下结构即可。

Not too com plicated really; the above code goes in place of the existing

"D3DWindow" initialisation code that we were using earlier.

事实上却不是太难,上面的代码替换前面存在的"D3DWindow"初始化代码即可。

D3DWindow.BackBufferHeight = 480

D3DWindow.BackBufferWidth = 640

修改屏幕宽度和高度

PS:翻译东西没想到这么累,我感觉在文章里面老外P话多了点,我没完全按字面翻译。因为本人英语水平有限,所以采用中英对译。本文的例子有代码下载,Graph_01.Zip,看看代码应该很容易理解了。

DirectX Graphics: Enumeration

Author : Jack Hoxley

翻译:FOX

Written : 2nd December 2000

Contact : [Email]

Download :Graph_02.Zip [11 Kb]

1. Introduction(介绍)

Enumeration is a fairly basic idea once you get used to it - and it's som ething that you're going to have to use if you intend to m ake a distributable application using DirectX. Enumeration is the process of capability detection - you ask it questions (about what it can do) and it will tell you if it can or cant do what you want it to do. As far as tutorials go it's fairly safe to hardcode the settings such as resolution and renderer - no ones really going to m iss out if it wont work, but if you're writing a real-world application that lots of people will be using (such as a published gam e) you want to m ake your application as solid as a rock.

“列举”是一个比较基本的思想,如果你想了解DIRECTX应用的属性,你就不得不用它。“列举”的作用就是把当前硬件系统支持的表述出来。就像前一章教程尽可能的去设置可行的渲染参数,没有人希望不能正常工作。所以当你要做一个公开的游戏,你总希望自己的程序是比较完善的。

Enumeration is what games use to display a list of resolutions that you can play the gam e at, but it's also used in ways you m ay not notice. For example, a program can query your hardware for the possibility of using bump-m apping; if the enumeration returns true then you get in-gam e bump-m apping. If it returns false the gam e can either decide to not use bum p-m apping or it can do som ething else (such as use software bum p-m apping).

“列举”是一个游戏可以调用哪些显示模式的一个清单。比如,一个游戏能够获取硬件是否支持“bump-mapping”(凹凸贴图)这一特效。如果“列举”返回为TRUE,那你可以在游戏里面使用这一特效。如果返回为FALSE,那意味这你将无法决定不用这个特效或者采用其他代替(比如软加速“bump-m apping”特性)

This lesson will introduce you to both of the m ain types of enum eration - display mode/renderer and hardware capabilities. But as there are so m any possible hardware capabilites to check only the structure will be discussed here - enumeration will be used in later tutorials, and any relevent details will be discussed then. But if you happen to have the DirectX8 SDK help file you can examine their descriptions/information on all of the possible enumerations.

这一课将给你介绍2个主要“列举”类型――显示模式和硬件支持特性。我们将在这里讨论很多可能的硬件特性被检查通过一个结构。“列举“将被在以后的课程里面使用。如果你碰巧手头上有DX8 SDK帮助文件,你可以通过它来了解更多的列举信息。

2. Display Device, Adapter and resolution enumeration

First up we want to know what m odes we can initialise our application in. In windowed m ode this doesn't m atter a great deal, but in fullscreen mode you must prepare a correct display mode setup that the hardware supports - or you'll get an error when trying to create the device. There is a basic hierachy that you need to remember when enume rating for display m odes and formats:

ADAPTER => DEVICE => RESOLUTIONS & CAPABILITIES

首先我们想知道什么显示模式我们可以在程序里面使用。在窗口模式的情况下将没有任何问题,但是在全屏模式下面你必须采用一个被硬件支持的显示模式设置,否则你在创建D3D8设备的时候会返回一个错误。一个基本的操作流程就是你需要记住当列举显示模式和格式的时候:

ADAPTER => DEVICE => RESOLUTIONS & CAPABILITIES

First we m ust query the adapters available, then selecting one of these adapters w e query what device's it supports (HAL or REFERENCE) then we m ust query the adapter-device com bination for the resolutions it supports and the hardware capabilities. So, first off I'll show you how to enum erate the adapters:

首先我们必须获取一个合适的适配器,然后再通过这个适配器获取该适配器所支持的设备(HAL 或者REF).所以,首先我将教你如何列举适配器:

Now that we can identify the adapter we can look at what devices it'll support. Software renderers are an advanced topic and are unlikely to be relevent yet so we'll ignore them for now. Instead we'll check if the hardware supports HAL (Hardware Accelaration). The reference rasterizer should always be present so we'll just assum e that we can access it.

既然我们可以识别适配器设备是否支持,软件加速渲染将成为一个高级主题,并且现在忽略。取而代之的是检查硬件是否支持HAL。

Above is a slightly sloppy way of detecting hardware support - but it works and is very sim ple. If we attempt to read stuff from a HAL device and it doesn't exist then we'll get the error code "D3DERR_NOTAVAILABLE", at which point we know that only the REF device is okay to use. The code outputs the results to a com bobox, which you can change if you want...

上面是代码比较少的方法来检查硬件支持-但是工作很简单。如果我们尝试去测试使用HAL设备,但它不存在,我们就会得到一个错误标签“D3DERR_NOTA V AILABLE”,那意味这我们只能使用REF设备。代码运行后结果输出到combobox里面,如果你需要你可以改变它。The last thing that we want to be able to check is what display m odes are supported. This can only be done when we've selected an adapter and a device.

最后的一件事情是检测显示器所支持的显示模式。这必须在已经选择完适配器和设备的前提下。

Private Sub EnumerateDispModes(Renderer As Long)

cmbRes.Clear '//Remove any existing entries...

Dim I As Integer, ModeTemp As D3DDISPLAYMODE

nModes = D3D.GetAdapterModeCount(cmbAdapters.ListIndex)

For I = 0 To nModes - 1 '//Cycle through them and collect the data...

Call D3D.EnumAdapterModes(cmbAdapters.ListIndex, I, ModeTemp)

'First we parse the modes into two catergories - 16bit and 32bit

If ModeTemp.Format = D3DFMT_R8G8B8 Or ModeTemp.Format =

D3DFMT_X8R8G8B8 Or ModeTemp.Format = D3DFMT_A8R8G8B8 Then

'Check that the device is acceptable and valid...

If D3D.CheckDeviceType(cmbAdapters.ListIndex, Renderer, ModeTemp.Format, ModeTemp.Format, False) >= 0 Then

'then add it to the displayed list

cmbRes.AddItem ModeTemp.Width & "x" & ModeTemp.Height & " 32 bit" & " [FMT: " & ModeTemp.Format & "]"

End If

Else

If D3D.CheckDeviceType(cmbAdapters.ListIndex, Renderer, ModeTemp.Format, ModeTemp.Format, False) >= 0 Then

cmbRes.AddItem ModeTemp.Width & "x" & ModeTemp.Height & " 16 bit" & " [FMT: " & ModeTemp.Format & "]"

End If

End If

Next I

cmbRes.ListIndex = cmbRes.ListCount - 1

End Sub

When you look at the sam ple code included with t his tutorial you will notice that it recalculates the resolutions and devices each tim e you change the adapter, and it changes the display mode list each tim e you select a new renderer.

当你看本章教程代码的时候,你会发现当每次改变适配器的时候都将重新计算,并且每次选择一个新的渲染器的时候都会改变显示模式列表。

3. Hardware Capability enumeration

The final useful part is to determ ine what features the hardware supports. This is particularly useful if you want to use a special feature that is hardware dependant and not very common yet (ie, at the cutting edge of technology). Capability enumeration is very simple, but there are 100's (maybe 1000's) or things you can check for.

最有用的一部分是获取硬件所支持的特性列表。当你想使用一些特别的特性,这点检测将十分有用。列举个特性列表非常简单,并且100%的特性都可以被检测。

Now that we have a structure holding all the information ("Caps") we c an query it for what we would like to know. There are lots of different flags that you can look at, all of them listed in VB's Object browser, but it's unlikely that you can guess what they all mean. The DirectX 8 help file lists them all with descriptions if you have it - otherwise you're just going to have to wait until someone tells you (they will be explained as you need them in later lessons) or guess.

既然我们有个结构去保存信息(CAPS),我们可以通过这个查询我们想知道的信息。我们可以看到很多不同的标签,所有的标签都将在VB物件里面显示,但是很难推测所有他们的意思。DX8帮助文件列举了所有他们的描述,否则你将等待别人告诉你或者自己推测(在后面的课程将做适当的解释)

Following are som e example of how to get inform ation on the hardware capabilities:下面代码将得到硬件特性信息;

本章完2D Graphics Part 1 - The Basics

Author : Jack Hoxley

Written : 7th December 2000

翻译:FOX

Contact : [Email]

Download : Graph_03.Zip [10 Kb]

1. Introduction(介绍)

Assuming that you've been following these lessons in the correct order (1...2...3 :) you'll have noticed that we haven't really done anything interesting yet - at least to look at. By the end of this tutorial you should be capable of doing som e interesting things in DirectX Graphics.

很幸运,你按照正常的次序来学习教程;)你可能已经注意到,我们还没有真正的做任何有趣的程序,至少没有可以看见的东西。但是当你看完整个教程,你将有能力通过DX Graphics来做些有趣的程序。(fox:外国人P话是多)

One thing that I dislike about DirectX8 is the way that everyone is forced straight into the world of 3D. Whenever anyone started working with DirectX 7 they'd be told to start with DirectDraw (the old 2D com ponent) because it's easier; then to m ove onto 3D. Having said that, it is [just about] possible to learn the basics of DirectXGraphics without getting too confused with all the 3D terminology. If you have any intentions of writing a fully-2D game you'd be wise to consider using either a hybrid of DirectX7 and 8, or just going straight directX 7.

使我比较讨厌DirectX8的一件事是,每一个人就把视线聚集在D3D世界里。无论什么时候,任何人开始学习DirectX 7时,他们都被告之从DIRECT DRAW学起(旧的2D组件,DX8已经取消,但可以通过获取接口使用),因为它比起3D来说,相对简单。话已至此,可能从基本的DirectXGraphics学起不会有太多的烦恼忙于推敲3D的术语。如果你打算写个纯2D游戏,你希望DX7和DX8混用还是单独的用DX7?!

Having said all that though, it's important to know how all this is done; because no matter how 3D your game is it'll probably need text, icons, pictures, health bars and so on... All of which will need to be done using these techniques.

道理前面基本都说完了,如何做这些是很重要的;因为无论什么3D游戏里面或许需要文字,图标,图片,血格等等……所有的这些我们都需要这些基本2D技术。

One thing to note when you work through the initial tutorials on 2D graphics is that they are essentially 3D. I'll go through alot of things very quickly - explaining only what you need to know about them in order to do 2D rendering; and you can read the later tutorials for a full lesson on each individual technique.

一件事你需要主意,你从本章学的2D图形,其实就是最基本的3D。我将快速的掠过这些东西,只解释一些为了渲染2D图形你必须知道的东西;并且你会在后面的教程里面学到每个单独的技术。

2. Some Theory(一些理论)

Vertices(顶点)

顶点(vertex)是什么?顶点就是3D空间中的一个点。例如,三角形有三个顶点,而矩形有四个。在3D空间中,你可以用三个顶点来指定一个三角形。想做到这些,你需要了解迪卡尔坐标系统。

2D Cartesian coordinate system (2D 迪卡尔坐标系统)

下面的两幅图演示了2D 迪卡尔坐标系统是怎样工作的。

2D迪卡尔坐标系统是很简单的,用两条轴x、y的值来表示点的位置,进而表现出图形的位置。这是初中时我们就学习过的。

3D Cartesian coordinate system (3D 迪卡尔坐标系统)

下面的两幅图演示了左手3D 迪卡尔坐标系统是怎样工作的。

有了第三个轴:z轴。现在,我们用这三个轴就能在3D空间中表示出物体的任意位置了。这其实是很简单的事情,我就不多说了。

3. Getting Started(开始)

I'm going to jum p in straight at where we left off in lesson 01. You should either be able to rem ember the initialisation code, or grab your tem plate - but I'm not going to go over it again now.

我将直接跳到第一课,你可能记住初始化代码,或者复习模板,但是我不会现在再复习一遍。

We need to m ake a few m odifications to the existing frame work that we [should] have. First there are som e new declarations:

我们需要对第一课的框架代码做一些修改。首先,需要一些新的声明。

Okay; nothing greatly com plicated in there. The first part is proba bly new to you though - Flexible Vertex Formats. This was possible in DirectX 7, but we now have to use them all the tim e. When we send data to the rendering device it wants to know what form at it's in - what data is to be found. The order in which you combine the flags and define your vertex type ARE important. The following Diagram

dem onstrates the order that they must go in:

OK,这里没什么复杂的。在第一部分里面“Flexible Vertex Formats”这个名词对你来说可能是新的。这个在DX7里面就已经存在,但我们现在需要使用。当我们把顶点数据发送到渲染设备,它需要知道是什么FVF结构。定义由标签组合的顶点格式是重要的。下面数据需要了较:

POSITION : X,Y,Z coordinates as 'Single' (Transformed or Untransformed)

X,Y,Z位置

RHW : Reciprocal Homogeneous W as 'Single'

BLEND1 : Blending Weights for vertex manipulation... all as 'single'

BLEND2

BLEND3

混合值

NX : Vertex Normals, all as 'Single'

NY

NZ

法线X,Y,Z值

POINT SIZE : For point Sprites only - defined as 'Single'

点尺寸(用于粒子)

DIFFUSE : vertex Diffuse colour as a 32bit ARGB long value

漫色光

SPEC ULAR : Vertex Specular data as a 32bit ARGB long

反射光

TEXCOORD1 : First set of texture coordinates

- - -

TEXCOORD8 : Final possible set of Texture coordinates

纹理坐标

Carrying on now, we need to m ake three changes to the General "Initialise" function; shown below:

我们需要在普通初始化函数里面加入3个变化:

###################################################################

'## FIRST WE NEED TO CHANGE HOW WE ACTUALLY CREATE THE OBJECT

'###################################################################

'//We're going to use Fullscreen mode because I prefer it to windowed mode :)

'DispMode.Format = D3DFMT_X8R8G8B8

DispMode.Format = D3DFMT_R5G6B5 'If this mode doesn't work try the commented one above...

DispMode.Width = 640

DispMode.Height = 480

D3DWindow.SwapEffect = D3DSWAPEFFECT_FLIP

D3DWindow.BackBufferCount = 1 '//1 backbuffer only

D3DWindow.BackBufferFormat = DispMode.Format 'What we specified earlier

D3DWindow.BackBufferHeight = 480

D3DWindow.BackBufferWidth = 640

D3DWindow.hDeviceWindow = frmMain.hWnd

'########################################################

'## THEN WE'LL NEED TO CONFIGURE THE RENDERING DEVICE

'########################################################

'//Set the vertex shader to use our vertex format

D3DDevice.SetVertexShader FVF

'//Transformed and lit vertices dont need lighting

' so we disable it...

D3DDevice.SetRenderState D3DRS_LIGHTING, False

'############################################

'## FINALLY WE'LL IMPLEMENT A NEW FUNCTION

'############################################

'//We can only continue if Initialise Geometry succeeds;

' If it doesn't we'll fail this call as well...

So, we've now configured our application to kick straight into 640x480 in 16bit mode, we set a couple of rendering options and we've implemented a new function. The rendering options (D3DDevice.SetRenderState) will be used more and more as we go along - we can control almost anything we would ever need to through this one call.

所以,我们已经配置好应用程序使用640*480*16B模式,我们设置了渲染选项,并且使用了一个新的函数。渲染选项(D3DDevice.SetRenderState)将会使用越来越多在以后。我们可以通过渲染选项(D3DDevice.SetRenderState)控制大多数的效果。

4. Initialising the Geometry(初始化几何体)

This is basically what the entire lesson is about - this is the m ain part you have to learn. Unfortunately it m eans that we also need to learn some m ore theory - this tim e it starts getting com plicated (well, sort of).

这是整章我们需要学的最基本的,也是最重要的一部分。不幸的是我们需要学习更多的原理,这个开始也意味着更加的复杂化。

Although you'll find 100's of references to the usage of polygons in 3D scenes we'll only ever use triangles. Which is still the sam e thing really (A triangle is the sim plest polgon possible), but I prefer to think of them as being triangles. The reason we use triangles is purely down to the Direct3D rendering engine - and general rendering techniques used by most engines, triangles are always convex, never concave, this makes them relatively easy to render. If you think about it, you can m ake any shape you so choose by using triangles. A square is just 2 triangles, therefore any quadrilateral can be m ade of two triangles: The following illustration explains...

虽然你发现在3D场景里面100%引用了多边形。其实这些多边形都是三角形构成。一个三角形是最简单的对边形。我们为什么用三角形是因为三角形对于D3D渲染引擎来说是最简洁的,并且大多引擎都使用这个最传统技术,三角形总是凸起的,而不是凹进去,这就使得很简单的去渲染。你可以通过三角形构建任何形状。一个矩形用2个三角形,下面的图表将进一步说明:

鼠标经常不能移动该怎么办

鼠标经常不能移动该怎么办 可能还有些网友对于鼠标经常不能移动的情况不太了解,下面就由小编给你们介绍鼠标经常不能移动的解决方法吧,希望能帮到大家哦! 鼠标经常不能移动该的解决方法: 鼠标不动,可以用键盘+光标键关机或重新启动或注销。按住键盘windows徽标键,打开开始菜单栏按“u”会弹出关机或重启界面,再按“u”就关闭电脑了。 组合键windows+u+u(在xp系统下用,win7系统用光标键移动),或者用光标键移动来执行想要执行的命令。也可以打开cmd,输入tsshutdn命令60秒后关机! 针对于usb接口的鼠标,突然之间不动了,我们只需要及时插拔,重新拔下再插上,就可以立即使用了。如果重新插了还是不能移动,那就说明电脑假死机了。按住热键组合键Ctrl+Alt+delete 键关机或注销或重启。如果键盘还可以操作,利用windows键打开开始菜单栏,用光标键移动来执行命令。或直接打开cmd,输入tsshutdn命令60秒后关机! 对于无线电鼠标突然不能移动了,这个时候您首先需要检查鼠标电池是否还有电?蓝牙端口配对是否有问题,没有电了,则需要换电池,与电脑蓝牙接口配对有问题,需要重新配对。如果鼠标的距离超出蓝牙操控规定的范围内,需要重新调整鼠标与电脑之间的距离。

附加鼠标经常移动点击没反应的解决方法: 1、点击桌面下方windows按钮,随后依次打开控制面板、系统、设备管理器。 2、在设备管理器列表中找到并展开“通用串行总线控制器”即可看到USBRootHub。如下图所示: 3、双击USBRootHub选项,在打开属性对话框,切换到“电源管理”,将“允许计算机关闭这个设备以节约电源”选项取消后按“确定”按钮即可;如下图所示: 看过“鼠标经常不能移动该怎么办”的人还看了: 1.鼠标不能移动了怎么办 2.鼠标不能移动怎么办 3.鼠标不能上下移动的解决方法 4.电脑鼠标突然不能移动怎么办 5.鼠标不好移动怎么办 6.鼠标故障无法移动怎么办

矩阵投影与最小二乘方法

题目:《神奇的矩阵——矩阵投影与最小二乘方法》 学校:哈尔滨工程大学 姓名:黎文科 联系方式: QQ群:53937814 联系方式: 190356321@https://www.wendangku.net/doc/3e803449.html,

矩阵投影与最小二乘方法 最小二乘法(Least Squares Method,简记为LSE)是一个比较古老的方法,源于天文学和测地学上的应用需要。在早期数理统计方法的发展中,这两门科学起了很大的作用。丹麦统计学家霍尔把它们称为“数理统计学的母亲”。此后近三百年来,它广泛应用于科学实验与工程技术中。美国统计史学家斯蒂格勒( S. M. Stigler)指出, 最小二乘方法是19世纪数理统计学的压倒一切的主题。1815年时,这方法已成为法国、意大利和普鲁士在天文和测地学中的标准工具,到1825年时已在英国普遍使用。 追溯到1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后全世界的科学家利用皮亚齐的观测数据开始寻找谷神星,但是根据大多数人计算的结果来寻找谷神星都没有结果。时年24岁的高斯也计算了谷神星的轨道。奥地利天文学家海因里希·奥尔伯斯根据高斯计算出来的轨道重新发现了谷神星。高斯于其1809年的著作《关于绕日行星运动的理论》中。在此书中声称他自1799年以来就使用最小二乘方法,由此爆发了一场与勒让德的优先权之争。 近代学者经过对原始文献的研究,认为两人可能是独立发明了这个方法,但首先见于书面形式的,以勒让德为早。然而,现今教科书和著作中,多把这个发明权归功于高斯。其原因,除了高斯有更大的名气外,主要可能是因为其正态误差理论对这个方法的重要意义。勒让德在其著作中,对最小二乘方法的优点有所阐述。然而,缺少误差分析。我们不知道,使用这个方法引起的误差如何,就需建立一种误差分析理论。高斯于1823年在误差e 1 ,… , e n 独立同分布的假定下,证明了最小二乘方法的一个最优性质: 在所有无偏的线性估计类中,最小二乘方法是其中方差最小的!在德国10马克的钞票上有高斯像,并配了一条正态曲线。在高斯众多伟大的数学成就中挑选了这一条,亦可见这一成就对世界文明的影响。 现行的最小二乘法是勒让德( A. M. Legendre)于1805年在其著作《计算慧星轨道的新方法》中提出的。它的主要思想就是选择未知参数,使得理论值与观测值之差的平方和达到最小: 2 211 ()()m m i i i H y y ===-=-∑∑理论值观测值

鼠标桌面上不移动怎么办

鼠标桌面上不移动怎么办 鼠标桌面上不移动的解决方法: 1、你在“计算机管理-设备管理器”下找到对应的鼠标,看看是否被禁用了。如果被禁用了,将禁用打开。 2、如果你用的是安装电池的无线鼠标,那么鼠标不动了可能会是鼠标电池没电了,换新的电池试用一下看看能不能动。 3、如果你不是无线鼠标,是有线的鼠标不动了,那么把鼠标连接电脑的插口重新插拔一下(usb插口的尽量多换几个插口试一下)。 4、如果重新插拔或换插口还是不行,那么最好拿另一只好的鼠标来换上试一下。 5、也可以在鼠标不动的情况下,按键盘上相关键,比如键盘最下面一排有小窗图标的键可以唤出开始菜单,看看电脑有没有死机,如果电脑没死机,基本确定是鼠标有问题,如果电脑不动了,可以重启再试鼠标。 6、基本上就是以上几个排查方面,有备用鼠标的话,直接替换鼠标试用是最省事的。 鼠标不灵敏怎么办 如果鼠标是光电无线鼠标的话可以检查一下电池是不是快没电了。如果电池充分的话可以检查一下电脑是否中毒。或者你应该换一个鼠标了。这个鼠标陪你太久了。

无线和有线鼠标都可以按照以下步骤对鼠标进行设置。 1.点击开始菜单,选择控制面板。 2.选择打印机和其他硬件。 3.选择鼠标 4.选择指针选项。勾选提高指针精确度。调节快还是慢,调节到适合自己感觉的时候,点击应用。确定。 鼠标灯亮不动怎么办 (一)怎么办? usb接口鼠标需重启,pc接口的鼠标不需要重启,即插即用 1、从接口拔下鼠标再插上试试 2、重启电脑 3、可能和系统有某些冲突,要么删除了,如果找不到就只好重装系统! 4、键盘能用的话用组合键ctrl+alt+del试下 5、建议更换新鼠标 6、要么是机器中毒了 (二)怎么回事? 1.鼠标本身(除非你赶上万分之几的次品率) 2.接口,接触不好或已坏,我的一个口就插鼠标没反应 3.电脑的供电或其他问题,让鼠标失去有正常工作的环境 4.硬件上中断冲突. 5.就是上面也说过的鼠标工作的表面介质,像玻璃镜子这类反光太强的不行,现象是会不动或乱跳,因为是鼠标底下是红光,所以红的表面当然就效果不好了,表面散射太多也不行(其实普通

获取当前鼠标所在的窗口句柄

用到的API函数: GetCursorPos 基本信息 函数功能:该函数检取光标的位置,以屏幕坐标表示。 函数原型:BOOL GetCursorPos(LPPOINT lpPoint); 参数: IpPoint:POINT结构指针,该结构接收光标的屏幕坐标。 使用时要先定义一个数据结构: Public Type POINTAPI x As Long y As Long End Type 例如: dim biao as POINTAPI GetCursorPos biao 那么biao.x用来存放当前光标的x轴坐标,biao.y用来存放当前y轴的坐标。 返回值:如果成功,返回值非零;如果失败,返回值为零。若想获得更多错误信息,请调用GetLastError函数。 备注: 1.光标的位置通常以屏幕坐标的形式给出,它并不受包含该光标的窗口的映射模式的影响。该调用过程必须具有对窗口站的WINSTA_READATTRIBUTES访问权限。 2.此函数为api函数,调用时要函数声明:Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long 速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:不支持;头文件:winuser.h;库文件:user32.lib。 WindowFromPoint 函数功能:该函数获得包含指定点的窗口的句柄。 函数原型:HWND WindowFromPoint(POINT Point); 参数:

Point:指定一个被检测的点的POINT结构。 返回值S:返回值为包含该点的窗口的句柄。如果包含指定点的窗口不存在,返回值为NULL。如果该点在静态文本控件之上,返回值是在该静态文本控件的下面的窗口的句柄。 备注:WindowFromPoint函数不获取隐藏或禁止的窗口句柄,即使点在该窗口内。应用程序应该使用ChildWindowFromPoint函数进行无限制查询,这样就可以获得静态文本控件的句柄。 速查:Windows NT:3.1以上版本:Windows:95以上版本;Windows CE:1.0以上版本:头文件:Winuser.h;库文件:user32.lib。 获取当前鼠标所在的窗口句柄代码: POINT pNow = {0,0}; If (GetCursorPos(&pNow)) { HWND hwndPointNow = NULL; hwndPointNow = WindowFromPoint(pNow); if (hwndPointNow) cout <<“Success!!”<< endl; else cout <<“Error!!”<< endl; } else cout <<“Error!!”<< endl;

投影大屏系统混合矩阵说明书

混合矩阵切换器说明书 第一章系统简介 MultiView Matrix 系列混合矩阵切换器,是一款高性能的专业PC信号切换设备,用于多个PC信号输入输出交叉切换,提供四种信号源的输入,信号源分别是是Video,VGA,DVI,YPbPr,每种信号单独传输,单独切换,输出可以是RGB和DVI,使信号传输衰减降至最低,图像信号能高保真输出。广泛应用在大屏幕显示工程、电视教学、指挥控制中心等场合。 Multiview Matrix系列混合矩阵切换器,主板采用自主研发出应于切换系统的巨量数据传输芯片技术,全新推出我公司独创的 180G/s处理高速宽带总线,彻底根除了处理数据总线带宽低下引起的显示速度慢且不稳定的瓶颈。 采用网络控制,可以传输数据量大。 可以支持RGB、DVI、HDTV、S-Video、NTSC/PAL格式信号输入,分辨率从640x480到1920x1200,刷新频率为60Hz;对每路输入信号采样都有特征记忆功能,在前级矩阵中可以任意切换输入信号,只要做过采样调整的信号再此输入,设备会自动配置记忆参数,无需二次采样调整。 可以支持RGB和 DVI信号同时输出,分辨率最高可达到1920x1200,刷新频率为60Hz,方便客户配置显示单元。 第二章技术参数 一计算机输入信号: 数量 4到72路DVI/RGB信号; 类型 DVI(数字)/ RGB(模拟); 分辨率 640x350,640x400,720x400,640x480,848x480,800x600, 848x480,1024x768,1152x864,1280x720,1280X768, 1280X960,1280x1024,1360x768,1400x1050,1440x900, 1600x1200,1680x1050,1792x1344,1856x1392, 1920x1080,1920x1200 像素, 刷新频率为60Hz;

2018-电脑鼠标自己乱动的解决方法-word范文 (3页)

本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除! == 本文为word格式,下载后可方便编辑和修改! == 电脑鼠标自己乱动的解决方法 没有使用鼠标垫,在光滑屏幕或者玻璃面上使用也会造成鼠标乱动。下面是小编收集整理的电脑鼠标自己乱动的解决方法,欢迎阅读。 电脑鼠标自己乱动的解决方法一: 鼠标指针自动移动、乱跳的原因: 1,鼠标底部透镜有杂物; 2,鼠标垫凹凸不平或者有杂物; 3,没有使用鼠标垫,在光滑屏幕或者玻璃面上使用也会造成鼠标乱动; 4,鼠标质量差,“丢帧”导致。 鼠标丢帧: 又叫“跳帧”。如果鼠标移动的时候反应非常非常“灵敏”,当轻微移动鼠标时,屏幕上的鼠标到处乱窜,导致无法控制它到指定的位置,那这时候就是鼠标跳帧了。 解决方法: 1,清理鼠标底部透镜的杂物; 2,清理鼠标垫的杂物或者更换平整的鼠标垫; 3,在鼠标垫上使用鼠标; 4,更换质量较好的鼠标。 电脑鼠标自己乱动的解决方法二: 原因一:鼠标垫不平。

解决方法:将鼠标垫铺平。 遇到鼠标乱动的情况,首先检查鼠标垫是否铺平。如果没有铺平,会造成鼠标乱动的情况,清理下鼠标垫。 原因二:鼠标进灰尘 解决办法:清理鼠标里的灰层 鼠标的滚动珠有缝隙,容易进灰层,卡住滚动珠,就会造成鼠标乱动,可以将鼠标拆开,清理下灰层。 原因三:某东西压住键盘或有东西掉进键盘的按键里。 解决办法:清理下键盘,保证键盘按键正常使用。 如果有东西压着笔记本的触摸板或者压住了键盘的按键或者有东西卡在按键里,都会造成鼠标乱动。 原因四:有木马或病毒 解决方法:使用杀毒软件清理木马和杀毒 如果电脑中木马或者中病毒,鼠标有可能会乱动,可以使用杀毒软件清理木马和病毒。 原因五:是否被远程控制 解决办法:关闭远程控制 有时候可能使用远程解决问题时选择允许被控制,却忘记结束远程控制,比如使用qq中的远程控制,所以遇到鼠标乱动的情况可以检查一下是否有开启远程的情况。 原因六:鼠标驱动与系统发生冲突 解决办法:将鼠标快速初始化的勾去掉 有时候可能是与系统发生冲突,那么就选择控制面板,找到鼠标,在快速初始化前的勾去掉。 相关文章:

openGL投影矩阵原理及数学推导

openGL投影矩阵 概述 显示器是2d的。3d场景需要转换为2d图像才能显示在屏幕上。投影矩阵(GL_PROJECTION)用于完成这个工作。投影矩阵将观察坐标(eye coordinates)转换成裁剪坐标(clip coordinates)。然后,裁剪坐标被除以w,转换为规范化的设备坐标(NDC)。 需要记住的一点是,裁剪操作和规范化都由投影矩阵(GL_PROJECTION)完成。下面介绍如何用6个参数(left,right,bottom,top,near,far)构建投影矩阵。 裁剪(clipping)操作是在裁剪坐标上进行的,安排在透视除法执行之前。裁剪坐标xc,yc,zc同wc比较,若每个分量都落在(-wc,wc)外,那么此坐标将被裁剪掉。 在透视投影中,3d场景中的点(观察坐标)从平截头体中映射到正方体(NDC)中;x坐标从[l,r]映射到[-1,1],y坐标从[b,t]映射到[-1,1],z坐标从[n,f]映射到[-1,1]。 注意到,观察坐标系是右手系,规范设备坐标系是左手系。这就有,在观察坐标系中,摄像机朝向沿着-z,而在NDC中,方向沿着z。由于glFrustum()只接受正参数,所以构造投影矩阵的时候要变号。 openGL中,3d场景中,观察坐标系下的点被投影到近投影面。下图展示了观察坐标系点(xe,ye,ze)投影到近投影面上的点(xp,yp,zp)。 从Top View of Projection看,xe投影到xp,根据等比性质:

从Side View of Projection看,yp计算类似: 注意到,xp和yp依赖于-ze,这一点要引起重视。在观察坐标被投影矩阵转换为裁剪坐标后,裁剪坐标仍然是同质坐标。在规范化阶段执行透视除法变为规范设备坐标(NDC)。 因此,可以将wc的值定为-ze。投影矩阵最后一行为(0,0,-1,0) 下一步,将xp,yp映射到xn,yn,此为线性映射[l,r]=>[-1,1],[b,t]=>[-1,1]:

透视投影(perspectiveprojection)变换推导

透视投影是3D固定流水线的重要组成部分,是将相机空间中的点从视锥体(frustum)变换到规则观察体(Canonical View Volume)中,待裁剪完毕后进行透视除法的行为。在算法中它是通过透视矩阵乘法和透视除法两步完成的。 透视投影变换是令很多刚刚进入3D图形领域的开发人员感到迷惑乃至神秘的一个图形技术。其中的理解困难在于步骤繁琐,对一些基础知识过分依赖,一旦对它们中的任何地方感到陌生,立刻导致理解停止不前。 没错,主流的3D APIs如OpenGL、D3D的确把具体的透视投影细节封装起来,比如 gluPerspective(…) 就可以根据输入生成一个透视投影矩阵。而且在大多数情况下不需要了解具体的内幕算法也可以完成任务。但是你不觉得,如果想要成为一个职业的图形程序员或游戏开发者,就应该真正降伏透视投影这个家伙么?我们先从必需的基础知识着手,一步一步深入下去(这些知识在很多地方可以单独找到,但我从来没有在同一个地方全部找到,但是你现在找到了)。 我们首先介绍两个必须掌握的知识。有了它们,我们才不至于在理解透视投影变换的过程中迷失方向(这里会使用到向量几何、矩阵的部分知识,如果你对此不是很熟悉,可以参考 可以找到一组坐标(v1,v2,v3),使得 v = v1 a + v2 b + v3 c (1) 而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得 p – o = p1 a + p2 b + p3 c (2) 从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p – o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点p: p = o + p1 a + p2 b + p3 c (3) (1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1, 4, 7),谁知道它是个向量还是个点! 我们现在把(1)(3)写成矩阵的形式:

笔记本鼠标无法移动该怎么办

笔记本鼠标无法移动该怎么办 笔记本鼠标无法移动的解决方法一: 鼠标不动,可以用键盘+光标键关机或重新启动或注销。按住键盘windows徽标键,打开开始菜单栏按“u”会弹出关机或重启界面,再按“u”就关闭电脑了。 组合键windows+u+u(在xp系统下用,win7系统用光标键移动),或者用光标键移动来执行想要执行的命令。也可以打开cmd,输入tsshutdn 命令60秒后关机! 针对于usb接口的鼠标,突然之间不动了,我们只需要及时插拔,重新拔下再插上,就可以立即使用了。如果重新插了还是不能移动,那就说明电脑假死机了。按住热键组合键ctrl+alt+delete键关机或注销或重启。如果键盘还可以操作,利用windows键打开开始菜单栏,用光标键移动来执行命令。或直接打开cmd,输入tsshutdn命令60秒后关机! 对于无线电鼠标突然不能移动了,这个时候您首先需要检查鼠标电池是否还有电?蓝牙端口配对是否有问题,没有电了,则需要换电池,与电脑蓝牙接口配对有问题,需要重新配对。如果鼠标的距离超出蓝牙操控规定的范围内,需要重新调整鼠标与电脑之间的距离。 笔记本鼠标无法移动的解决方法二: 鼠标指针抖动及自行移动的问题,在日常生活中较为常见,

不正确的使用习惯和鼠标自身硬件问题,均有可能造成鼠标指针抖动和自行移动的现象发生。让我们一起来进行总结,看看那些情况会导致鼠标指针自行移动。 1、表面兼容性问题 表面兼容性问题而导致鼠标指针自行移动现象,应该是最为常见的一种情况,尤其是在部分主廉价鼠标上,该问题可以说是屡见不鲜。为压缩鼠标制造成本,部分鼠标使用了表面兼容能力较引擎的鼠标引擎,在部分三维表面(例如毛巾,皮草)及特殊纹理表面(表面具备一定反光性的白色杂不规则黑灰色点表面)上使用时,鼠标会出现抖动及自行移动的问题 解决方案:使用深色,表面色彩过渡较少的鼠标垫,优先布质。 2、鼠标透镜松动 鼠标由于内部出现损坏或装配不好,造成鼠标引擎成像透镜松动,同样会出现鼠标指针自动移动的现象,这是因为鼠标透镜出现错位,引擎无法捕捉到正确的表面定位信息所造成,该现象在一些廉价鼠标上出现的机率较高,这是由于廉价鼠标通常均停靠鼠标上盖直接压紧电路板及透镜,当压紧机构出现损坏时,即导致透镜移位松动。 解决方案:拆开鼠标,看鼠标透镜是否固定良好,如出现松动可将透镜重新放正并固定好。

投影矩阵的定义

视锥就是场景中的一个三维空间,它的位置由视口的摄像机来决定。这个空间的形状决定了摄像机空间中的模型将被如何投影到屏幕上。透视投影是最常用的一种投影类型,使用这种投影,会使近处的对象看起来比远处的大一些。对于透视投影,视锥可以被初始化成金字塔形,将摄像机放在顶端。这个金字塔再经过前、后两个剪切面的分割,位于这两个面之间的部分就是视锥。只有位于视锥内的对象才可见。 视锥由凹视野( 在上图中,变量 投影矩阵是一个典型的缩放和透视矩阵。投影变换将视锥变换成一个直平行六面体的形状。因为视锥的近处比远处小,这样就会对靠近摄像机的对象起到放大的作用,也就将透视应用到了场景当中。 在视锥中,摄像机与空间原点间的距离被定义为变量 视矩阵将摄像机放置在场景的原点。又因为投影矩阵需要将摄像机放在 将两个矩阵相乘,得到下面的矩阵: 下图显示了透视变换如何将一个视锥变换成一个新的坐标空间。注意:锥形体变成了直平行六面体,原点从场景的右上角移到了中心。 在透视变换中,

这个矩阵基于一定的距离(这个距离是从摄像机到邻近的剪切面)对对象进行平移和旋转,但是它没有考虑到视野( 在这个矩阵中, 在程序中,使用视野角度来定义x和y缩放系数比使用视口的水平和垂直尺寸(在摄像机空间中)并不方便多少。下面两式使用了视口的尺寸,并且与上面的公式相等: 在这些公式中,Zn表示邻近的剪切面的位置,变量Vw和Vh表示视口的高和宽。这两个参数与 D3DVIEWPORT2结构中的dwWidth和dwHeight成员相关。 不管你使用那个公式,将同世界和视变换一样,可以调用下面的 D3DMATRIX ProjectionMatrix(const float near_plane,// distance to near clipping plane const float far_plane,// distance to far clipping plane const float fov_horiz,// horizontal field of view angle, in radians const float fov_vert)// vertical field of view angle, in radians { float h, w, Q; w = (float)cot(fov_horiz*0.5); h = (float)cot(fov_vert*0.5); Q = far_plane/(far_plane - near_plane); D3DMATRIX ret = ZeroMatrix(); ret(0, 0) = w; ret(1, 1) = h; ret(2, 2) = Q; ret(3, 2) = -Q*near_plane; ret(2, 3) = 1; return ret; } // end of ProjectionMatrix()

弹塑性矩阵推导

弹塑性矩阵推导

考虑材料的塑性,其增量形式的本构关系可表达为 p d σ=(D -D )d ε (1) 式(1)中,D 为弹性矩阵,p D 为塑性矩阵。 弹性矩阵D 的形式为 422000333242000333224000333000000 000000000K G K G K G K G K G K G K G K G K G G G G ??+--??????-+-???? =??--+?????? ?????? D (2) 体积模量3(12) E K μ= -,剪切模量2(1) E G μ=+。 在应变空间内,塑性矩阵可表达为 1()T f f A ??= ??p D D D σσ (3) 式中, ( )()T T p f f f f A B ????=--????D D σσσσ (4) f 为屈服函数;p σ为塑性应力,p p =σD ε; 1/2(()())T p T p T p f f f f B f f f ωθε??? ???? ??? '=???? ????????? σσ I σσσ (5) [111000]T '=I ;p ω为塑性功;p θ为塑性体应变;p ε为等效塑性应变; κ为反映加载历史的参数。 当p κω=时 当p κθ=时 当p κε=时

对于Drucker-Prager 模型,其屈服条件为 120f I J α== (6) 1x y z I σσσ=++,222222 21()2 x y z xy yz zx J S S S S S S = +++++,α为材料常数。 2 2f J α?''=?I σ (7) 222T x y z xy yz zx S S S S S S '??=??S (8) 22 ()32f K J J αα?'''==+?D D I I σ (9) 222 ( )()(3)92T T T f f A K K G J J ααα??'''===+??D I I σσ (10) 1()T f f A ??= ??p D D D σσ 222 22222 222222112123113211212311321121231131121121121(3)(3)999(9)(9)(9)(T T T T T T K K K G J J K G K G K G J K G J K G J m mn ml S m S m S m mn n nl S n S n S n ml nl l S l S l S l S m S n S l ααααααααβββββββββββββ''= + +''''=++++++=p D I I I I S SS 21121122231122132123123123 1122231231132232 113113113113212113223113)()()S S S S S S m S n S l S S S S S S m S n S l S S S S S ββββββββββββββββββββ?? ? ? ???? ? ? ?????? ?????????? 令4 3 p K G =+,23 q K G =- 弹塑性矩阵可表达为 211212311321121231132 1121231132112112112112112223112213123 123123 112223()(p m q mn q ml S m S m S m q mn p n q nl S n S n S n q ml q nl p l S l S l S l S m S n S l G S S S S S S m S n S l S S G βββββββββββββββββββββββ------------------=-=-----?-?----?-ep p D D D 21231132232 113113113113212 113223 113)()S S S S m S n S l S S S S G S ββββββββββ?? ?? ? ??? ? ? ???? -???----?-?-??? ?

用3DMAX打造逼真鼠标模型的教程

鼠标是最常用的电脑外设了,时间长了对它也会有一种特殊的感情,下面我们用3DMAX来打造一只常见的滚轮鼠标模型。 效果图: 制作工具:3DMAX9.0 制作过程: 1、在视图中创建4个用于拟合放样的二维模型,分别为基础路径、基础截面、X轴拟合图形、Y轴拟合图形,如图所示。

2、在顶视图中选择“基础路径”,然后进行基本放样操作,选择前视图中的“基础截面”。 3、进入修改命令面板,展开“变形”卷展栏,单击其中的“拟合”按钮,在弹出的窗口中单击“均衡”按钮取消坐标轴的锁定状态,这样可以分别对两个轴进行调整,效果如图所示。

4、单击“获取图形”按钮,然后在顶视图中选取“X轴拟合图形”,这时可以看到视图中出现了一个变形的造型。单击“顺时针旋转90度”按钮,效果如图所示。

5、在“拟合变形”窗口中单击“显示Y轴”按钮,并在左视图中选取“Y轴拟合图形”,然后单击“水平镜像”按钮,此时可以产生基本的鼠标造型效果,如图所示。 6、制作凹槽,在视图中的创建如图所示的模型作为布尔运算的模型,利用“选择并移动”工具调整好位置。

7、选择放样模型,在“几何体”面板中的下拉列表框中选择“复合对象”选项,然后单击“布尔”按钮,进行布尔运算,产生鼠标凹槽。 8、单击“标准基本体”面板中的“圆环”按钮,在左视图中创建一个圆环作为滚轮,并修改相关的属性参数。 9、单击“图形”面板中的“线”按钮,在顶视图中创建一条曲线。再利用“图形”面板中的“圆”工具在前视图中创建一个圆形。 10、选择绘制的曲线,然后在“几何体”面板中的下拉列表框中选择“复合对象”,并单击其中的“放样”按钮,实现放样操作,此时放样操作拾取的截面为前视图中的圆形。

鼠标指针不能自由移动怎么办

鼠标指针不能自由移动怎么办 鼠标指针不能自由移动的解决方法一: 故障现象: 在桌面上移动鼠标器时屏幕上的光标不能灵活移动。 故障分析与处理: 故障分析与处理:一般这种现象可分两种情况考虑: (1)由于鼠标器受到强烈振动,如掉在地上,使红外发射或接收二极管稍稍偏离原位置造成故障。这种现象的特点是光标只在一个方向(如x方向)上移动不灵活。 (2)鼠标器的塑胶圆球和压力滚轴太脏(如有油污),使圆球与滚轴之间的摩擦力变小,造成圆球滚动时滚轴不能同步转动。这种现象往往是光标向各方向移动均不够灵活。处理方法如下: ①.将鼠标底部螺丝拧下,小心打开上盖。轻轻转动压力滚轴上的圆盘,同时调整圆盘两侧的二极管,观察屏幕上的光标,直到光标移动自如为止。 ②.打开鼠标器上盖取出塑胶球,用无水酒精将塑胶球和压力滚轴清洗干净。 鼠标指针不能自由移动的解决方法二: 第一:系统出现了卡顿: 一般情况系统出现卡顿,运行内存卡主,伴随着鼠标的不动。一般来说系统卡顿也有很多的方面,例如散热效果不好,系统配

置没有进行更新配置较低,电脑中的垃圾过多,没有及时清理,或者是内存不足硬盘性能低等问题。 第二:鼠标连接线接触不良: 一般鼠标的接口有usb和ps/2两种,如果鼠标不动,我们检查是否是鼠标接口接触不良,我们来晃动鼠标,如果鼠标偶尔可以移动说明接触不良,如果晃动鼠标线依然不动,则可以换个接口试试或者换个电脑试试。 第三:鼠标坏了: 要想知道鼠标是否坏了,如果出现鼠标不动这类问题,我们可以进行换个电脑试试。如果换了电脑,鼠标指针依然不动那么可以断定是鼠标坏了。 第四:硬盘驱动问题: 驱动破坏和缺失也会造成鼠标不动的问题,如果出现在这种情况,就要卸载原有驱动,重新拔插让电脑自动识别鼠标并安装驱动。 第五:电压不足,电源功率不够稳定 电压不足的时候,也会出现鼠标不动的问题。

投影矩阵的计算过程

投影矩阵的计算过程3d模型经过世界坐标变换、相机坐标变换后,下一步需要投影变换。投影变换的目的就是要把相机空间转换到标准视图空间,在这个空间的坐标都是正规化的,也就是坐标范围都在[-1,1]之间,之所以转换到这个空间是为了后续操作更方便。下面的讨论都是以列向量来表示,这样在变换操作时,采用的是矩阵左乘法,如果采用的是行向量的话,那就相反,矩阵右乘法即是向量在左边乘以变换矩阵。采用哪种表示并不影响结果,只需要把该种表示下得出的变换矩阵转置一下,就是采用另外一种表示模式需要的结果。常见的投影有两种,正交投影和透视投影,正交投影相对来说更简单,所以先来看看正交投影。最简单的正交变换矩阵 1 0 0 0 0 1 0 0 0 0 0 1 这个正交变换是不可逆变换,变换后x和y保留,z变成了0,在实际应用中,更常见的情况是限定x、y、z在一定的范围内的进行投影变换,比如x[l,r],y[b,t],z[n,f]。那么要把这段空间中的点变换到-1和1之间,只要完成两个变换,首先把坐标轴移到中心,然后进行缩放就可以了。采用列向量的话,那就是缩放矩阵乘以平移矩阵。2/(r-l) 0 0 0 1 0 0 -(r+l)/2 2/(r-l) 0 0 -(r+l)/(r-l) 0 2/(t-b) 0 0 x 0 1 0 -(b+t)/2 = 0 2/(t-b) 0 -(t+b)/(t-b) 0 0 2/(f-n) 0 0 0 1 -(n+f)/2 0 0 2/(f-n) -(f+n)/(f-n) 0 0 0 1 0 0 0 1 0 0 0 1 透视投影类比于我们人眼系统,看一个物体,会有远小近大的效果。在转换到相机空间后,相机是这个空间的原点,和正交投影体是一个长方体或者立方体不同,透视投影体是一个锥体被近平面截取掉头部剩下的空间。假定仍然采用上面的坐标表示。在透视投影下,空间上面的任何一点P投影到近平面上某点q,通过三角几何学我们可以得到qx=px*n/pz ,y点同理。假定直接投影到近平面,则该矩阵很简单,用Ma表示下面的矩阵1 0 0 0 0 1 0 0 0 0 1 0 0 0 1/n 0 则齐次空间某点(x,y,z ,1)被该矩阵转换后变成了(x ,y z, z/n) ,除以z/n,则变成了(nx/z,ny/z,n ,1) 正好吻合上面的公式。 undefined 但是我们知道投影变换需要把坐标变换到-1和1之间,假定先不考虑z轴的变换,在x轴和y轴上面经过上述变换后,已经投影在近平面了,假设近平面xy在[l,r] 和[b,t]之间了,因此只需要和上面的正交投影一样,进行平移和缩放操作就可以了,平移矩阵Mb为 1 0 0 -(l+r)/2 0 1 0 -(t+p)/2 0 0 1 -(f+n)/2 0 0 0 1 以及缩放矩阵Mc 2/(r-l) 0 0 0 0 2/(t-b) 0 0 0 0 2/(f-n) 0 0 0 0 1 McXMbXMa 得到的矩阵为2/(r-l) 0 -(r+l)/(n*(r-l))0 0 2/(t-b) -(t+b)/(n*(t-b)) 0 0 0 j k 0 0 1/n 0 j k 为未知数,这个矩阵也可以同时乘以n,则变为2n/(r-l) 0 -(r+l)/(r-l) 0 0 2n/(t-b) -(t+b)/(t-b) 0 0 0 j k 0 0 1 0 为了求解J k,我们需要把z变换到-1 和1 因此当z=n时为-1,z=f时为1 (j*n+k)/n= j+k/n=-1; 同理j+k/f=1; 得到k=2f*n/(n-f) j=-(n+f)/(n-f) 代入上面的矩阵,就得出通用的正交变换矩阵。而且在一般情况下r=-l ,b=-t 因此上述矩阵可以简化为n/r 0 0 0 0 n/t 0 0 0 0 -(n+f)/(n-f) 2f*n/(n-f) 0 0 1 0 n/r 和n/t可以进一步简化成水平半视角和垂直半视角的三角函数来表示,而水平视角和垂直视角和透视窗口的宽高比有是成正比的,最终上面两行可以用宽高

大漠插件后台找图、自动获取坐标窗口句柄鼠标多点左单击脚本

大漠插件后台找图、自动获取坐标窗口句柄鼠标多点左单击 脚本 一、准备工作 第一步:下载大漠插件、解压,运行“注册大漠插件到系统.bat”,把全部东东都复制到按键精灵的plugin目录下吧~ 第二步:创建一个文件夹,以d:\test 为例。把你要找的图(60.bmp)、大漠插件里的dm.dll 和RegDll.dll复制到这个文件夹。 第三步:打开按键精灵,创建一个新脚本。往附件(在软件左边框选项)里面添加dm.dll、Reg.dll和图60.bmp 二、复制以下代码到按键精灵 dim ys1,ys2,ys3,a,b,zbx,zby//自定义变量 ys1=9000//1和2点延时 ys1=9000//2和3点延时 ys1=9000//3和1点延时 a=15//纵向下移15单位 b=-15//纵向上移15单位 zbx=100//获取窗口句柄给定的坐标x zby=100//获取窗口句柄给定的坐标y PutAttachment "d:\test", "*.*" //意思是释放所有附件到d:\test目录。就是把有用的文件打包到test目录下 PutAttachment ".\Plugin", "RegDll.dll" //意思是释放RegDll.dll文件到按键精灵安装目录的Plugin目录下,用来完成大漠插件的注册 Call Plugin.RegDll.Reg("d:\test\dm.dll") //调用大漠插件,在按键精灵中使用 Set dm = createobject("dm.dmsoft") //用大漠插件创建一个对象dm dm_ret = dm.SetPath("d:\test") // 设置全局路径,以后你找图用的图片都默认是test目录里的图片了,否则你要用绝对路径d:\test\1.bmp来该表示图片 dm_ret = dm.LoadPic("*.bmp") // 字面意思是加载test目录下的所有图片 Hwnd = dm.GetPointWindow(zbx,zby)//用大漠软件获取给定坐标(zbx,zby)的窗口句柄,保存在Hwnd里 Call Plugin.Window.Move(Hwnd, 0, 0) // 把窗口移到屏幕的(0,0),即左上角 dm_ret = dm.BindWindow(Hwnd,"gdi","windows","windows",0) //这句用来绑定辅助操作的对象窗口 //下面是一条判断语句,如果绑定失败就会提示。那就从前面几几步中找原因吧 Delay 10 If dm_ret = 1 Then Else MessageBox "绑定失败,重启脚本或联系作者" EndScript

鼠标指针飘忽不定怎么办

鼠标指针飘忽不定怎么办 鼠标指针飘忽不定的解决方法一: 1:鼠标本身出问题了,可能里面的零件坏了,建议换个鼠标试试,如果换个解决问题,就是鼠标的问题。 2:是否usb接口松动或者usb接口出问题,接触不良,换个接口看看。 3:未安装鼠标的驱动,可以下载驱动精灵之类的软件,安装相应驱动。 其次: 1:可能是中毒了,注意最近有没打开不去安全的网站,建议下载杀软杀下毒试试。 2:鼠标没有插好,usb接口老化也可能导致问题,建议重启电脑,换个插口。 3:驱动有问题,建议到我的电脑--管理--设备管理器,找到鼠标,右键属性,找到驱动那项,回滚驱动程序。 4:还是没解决的话,可能是鼠标本身的问题,可能是编码器出问题了,如果是的话可以买个焊上去。 5:系统问题,建议重装系统。 鼠标指针飘忽不定的解决方法二: 以下几种情况可以导致鼠标不受控制晃动。 1、表面兼容性问题

表面兼容性问题而导致鼠标指针自行移动现象,应该是最为常见的一种情况,尤其是在部分主廉价鼠标上,该问题可以说是屡见不鲜。为压缩鼠标制造成本,部分鼠 标使用了表面兼容能力较引擎的鼠标引擎,在部分三维表面(例如毛巾,皮草)及特殊纹理表面(表面具备一定反光性的白色杂不规则黑灰色点表面)上使用时,鼠标会出现抖动及自行移动的问题 解决方案:使用深色,表面色彩过渡较少的鼠标垫,优先布质。 2、鼠标透镜松动 鼠标由于内部出现损坏或装配不好,造成鼠标引擎成像透镜松动,同样会出现鼠标指针自动移动的现象,这是因为鼠标透镜出现错位,引擎无法捕捉到正确的表面定 位信息所造成,该现象在一些廉价鼠标上出现的机率较高,这是由于廉价鼠标通常均停靠鼠标上盖直接压紧电路板及透镜,当压紧机构出现损坏时,即导致透镜移位松动。 解决方案:拆开鼠标,看鼠标透镜是否固定良好,如出现松动可将透镜重新放正并固定好。 3、鼠标透镜杂物 与前两项问题相比,由于鼠标透镜成像区域进入杂物,导致鼠标出现抖动/自行移动的问题更为常见。当毛发及一些细微灰尘,进行鼠标底部成像透镜区域时,由于毛发和灰尘会对鼠标引擎定位造成影响,同样会导致鼠标出现自行移动的现象。 解决方案:该现象解决较为简单,只需将鼠标翻转,然后使

API 鼠标坐标获取

效率就是你了解的类库。每天学习一点点。 c# private void Form1_MouseMove(object sender, MouseEventArgs e) { this.Text = Cursor.Position.X.ToString() + ":" + Cursor.Position.Y.ToString(); } 调用API using System; using System.Collections.Generic; using https://www.wendangku.net/doc/3e803449.html,ponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace mouse { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public delegate int HookProc(int ncode, IntPtr wParam, IntPtr lParam); static int hHook = 0; public const int WH_MOUSE = 7; //private System.Windows.Forms.Button button1; //Declare MouseHookProcedure as HookProc type. HookProc MouseHookProcedure; //Declare wrapper managed POINT class. [StructLayout(LayoutKind.Sequential)] public class POINT { public int x; public int y; }

鼠标不能移动很少人知道的原因

鼠标不能移动很少人知道的原因: 本人以往发表过4篇“鼠标不能移动很少人知道的原因”,现再补充内容,以覆盖前4篇。本文章共9205字。 首先要把鼠标连接其它电脑,如鼠标能正常运行,即证明非鼠标本身故障,可采用下列方法解决: 主要之一.在System32文件夹里面如有dllhost.dll此文件,会致鼠标完全不能移动或移动不灵的故障,如要彻底删除它,注意,要先在任务管理器里结束它的进程树,才可彻底删除该文件程序。打开任务管理器方法,按Ctrl+Alt+Del 单击进程,右击dllhost.dll此进程,单击结束进程树。 提示,如此时鼠标不能移动时,可开启鼠标键或采用XP系统各种快捷键来操作删除dllhost.dll。 提示,硬盘里有些文件不能删除原因,是由于该文件程序正在进程中,只有结束该程序的进程树,才能把该程序所关联的文件全部删除。 主要之二.当鼠标完全不能移动时,或在设备管理器里没有显示鼠标设备时,并且屏幕没有显示指针时,可采用以下特殊方法解决: 可开启鼠标键,方法是先按左边的Alt+Shift 二键,再按NUmLock 键,弹出对话框后,按回车键,如果屏幕还是没有显示指针时,可反复按NUmLock键,或再按左边的Alt+Shift 二键后,再按NUmLock键,弹出对话框后,按回车键,再按4个方向键其中之—,屏幕就可显示指针了,即可通过按数字键区的4个方向键来移动指针了。数字键区的4个方向键中间的5是单击键或双击键,1、3、7、9 键是斜向移动指针键,如要使用右键单击,可按—次5键后,再按微软键旁边那个不知名的键。此方法对笔记本电脑不行。在硬盘里新建一个文件夹,随便输入一个名称,然后把inf文件夹(它是隐藏的文件夹)和Driver Cache文件夹剪切到该新建的文件夹里面,然后在drivers文件夹里搜索到termdd.sys这个驱动文件后彻底删除它。然后,打开设备管理器,把Teiminal Server Mouse Driver(隐藏设备)卸载。提示,为什么要把inf文件夹(它是隐藏的文件夹)和Driver Cache文件夹剪切到新建的文件夹里面呢,原因是它是硬件驱动文件,由于操作系统找不到这二个文件夹,termdd.sys这个驱动就不再重新自动安装了。注意,如果今后要添加新硬件时之前,再把inf文件夹和Driver Cache文件夹剪切回到原来的位置,inf文件夹和Driver Cache 文件夹都在WINDOWS文件夹下。 XP系统主要快捷键: Ctrl+C 复制

相关文档