搜档网
当前位置:搜档网 › DirectX 3D鼠标拾取

DirectX 3D鼠标拾取

Direct3D中实现图元的鼠标拾取

3D交互图形应用程序中,常常要用鼠标去选择图形,其实现的机制基于鼠标拾取算法。本文主要讲述如何在D3D中实现图元的鼠标拾取。为了讨论简单,本文假定读者理解D3D 坐标变换流程和基本的图形学知识,如果阅读有困难请参考相关资料。

1、什么是拾取,拾取能做什么?

首先,拾取操作指当我们在屏幕上用鼠标点击某个图元应用程序能返回该图元的一个标志和某些相关信息。有图形程序设计经验的人都知道,有这些信息就表示我们有了对该图元的控制权,我们可以删除,可以编辑,可以任意对待该图元,至于你到底想干什么,就是阁下自己的事了^_^。

2、拾取操作的步骤和实现

拾取算法的思想很简单:得到鼠标点击处的屏幕坐标,通过投影矩阵和观察矩阵把该坐标转换为通过视点和鼠标点击点的一条射入场景的光线,该光线如果与场景模型的三角形相交(本文只处理三角形图元),则获取该相交三角形的信息。本文讲述的方法除可以得到三角形的一个索引号以外还可以得到相交点的重心坐标。

从数学角度来看,我们只要得到射线的方向矢量和射线的出射点,我们就具备了判断射线与空间一个三角面是否相交的条件,本文主要讨论如何获得这些条件,并描述了射线三角面相交判断算法和D3D的通常实现方法。

根据拾取操作的处理顺序,大概可以依次分为以下几个步骤

2.1.变换并获得通过视点和屏幕上点击点的射线矢量(Dir)

详细介绍之前,为了大家方便理解,我们要先简单说一下d3d坐标转换的大概流程,如下图:

所以我们要通过一系列的反变换,得到我们关心的值在世界坐标中的表示。

2.1.1 确定鼠标选取点的屏幕坐标

这一步是非常简单的Windows给我们提供了API来完成屏幕坐标的获取,使用GetCursorPos获得鼠标指针位置,然后再利用ScreenToClient转换坐标到客户区坐标系(以窗口视区左上角为坐标原点,单位为像素),设该坐标为(POINT screenPt)。

2.1.2 得到Dir在观察坐标空间内的表示

在观察坐标系中,Dir是一条从观察坐标原点出发的射线,所以我们只需要再确定一个该射线经过的点,就可以得到它在观察坐标系中的表示。假设我们要求的射线上的另外一点为该射线与透视投影平截头体近剪切面的交点,针对最普遍的透视投影而言,透视投影平截头体经投影变换后,变成一个1/2立方体(请允许我这么叫^_^,因为它的大小为一个正方体的一半,x,y方向边长为2,z方向为1)如图:

投影坐标系以近剪切面中心为坐标原点,该立方体从z轴负向看过去与图形程序视区相对应,最终近剪切面(前剪切面)上一点与屏幕坐标之间的对应关系如下图所示:

根据比例关系,screenPt与投影空间上的点projPt之间的关系为

假设图形程序窗口的宽为screenWidth,高为screenHeight,

projPt.x = (screenPt.x-screenWidth/2)/screenWidth*2; (公式1)

projPt.y = (screenPt.y-screenHeight/2)/screenHeight*2; (公式2)

projPt.z =0;(实际该值可任意取,不影响最终结果。为了处理简单,我们取改值为0,表示该点取在近剪切面上)

得到projPt后,我们需要做的是把该点坐标从投影空间转换到观察空间(view space),根据透视投影的定义,可假设点(projPt.x,projPt.y,projPt.z)

对应的其次坐标为

(projPt.x*projPt.w,projPt.y*projPt.w,projPt.z*projPt.w,projPt.w)

我们可以通过 GetTransform( D3DTS_PROJECTION, &ProjMatrix)函数获得投影矩阵ProjMatrix,则根据观察空间到投影空间的变换关系则

(projPt.x*projPt.w,projPt.y*projPt.w,projPt.z*projPt.w,projPt.w)

= (viewPt.x,viewPt.y,viewPt.z, 1)*pProjMatrx;

根据定义和图形学原理

ProjMatrix = =

所以,

(projPt.x*projPt.w,projPt.y*projPt.w,projPt.z*projPt.w,projPt.w)

= ( viewPt.x*ProjMatrix._m11,

viewPt.y*ProjMatrix._m22,

viewPt.z*Q-QZn,

viewPt.z)

所以

projPt.x*projPt.w = viewPt.x*ProjMatrix._m11

projPt.y*projPt.w = viewPt.y*ProjMatrix._m22

projPt.z*projPt.w = viewPt.z*Q-QZn (注意projPt.z = 0)

projPt.w = viewPt.z;

解得

viewPt.x = projPt.x*Zn/ ProjMatrix._m11;

viewPt.y = projPt.y*Zn/ ProjMatrix._m22;

viewPt.z = Zn;

好了,到这里为止我们终于求出了射线与近剪切面交点在观察坐标系中的坐标,现在我们拥有了射线的出发点(0,0,0)和射线方向上另外一点(viewPt.x,viewPt.y,viewPt.z),则该射线的方向矢量在观察空间中的表示可确定为(viewPt.x-0,viewPt.y-0,viewPt.z-0),化简一下三个分量同除近剪切面z坐标Zn,该方向矢量可写作

DIRview = (projPt.x/projMatrix._m11,projPt.y/projMatrix._m22,1)

代入公式1,公式2

DIRview.x = (2*screenPt.x/screenWidth-1)/projMatrix._m11;

DIRview.y = (2*screenPt.y/screenHeight-1)/projMatrix._m22;

DIRview.z = 1;

其中screenWidth和screenHeight可以通过图像显示的backBuffer的目标表面(D3DSURFACE_DESC)来获得,该表面在程序初始化时由用户创建。

2.1.3 转换Dir到世界坐标空间,并得到观察点在世界坐标系中的坐标

由于最终的运算要在世界坐标空间中进行,所以我们还需要把矢量DIRview从观察空间转换为世界坐标空间中的矢量DIRworld。

因为

DIRview = DIRworld*ViewMatrix;

其中ViewMatrix为观察矩阵,在D3D中可以用函数GetTransform( D3DTS_VIEW, &ViewMatrix )得到。

所以DIRworld = DIRview * inverse_ViewMatrix,其中inverse_ViewMatrix为

ViewMatrix的逆矩阵。

观察点在观察坐标系中坐标为OriginView(0,0,0,1),所以其在世界坐标系中的坐标同样可以利用ViewMatrix矩阵,反变换至世界坐标系中,事实上我们可以很简单的判断出,其在世界坐标系中的表示为:

OriginWorld = (inverse_ViewMatrix._41,

inverse_ViewMatrix._42,

inverse_ViewMatrix._43,

1);

到这里为止,判断射线与三角面是否相交的条件就完全具备了。

2.2 使用射线矢量对场景中的所有三角形图元求交,获得三角形索引

值和重心坐标。

这一步骤地实现由两种途径:

第一种方法非常简单,利用D3D提供的扩展函数D3DXIntersect可以轻松搞定一切。见2.1 第二种方法就是我们根据空间解析几何的知识,自己来完成射线三角形的求交算法。一般来讲,应用上用第一种方法就足够了,但是我们如果要深入的话,必须理解相交检测的数学算法,这样才能自由的扩展,面对不同的需求,内容见2.2

下面分别讲解两种实现途径:

2.2.1 D3D扩展函数实现求交

这种方法很简单也很好用,对于应用来说应尽力是用这种方式来实现,毕竟效率比自己写得要高得多。

实际上其实没什么好讲的,大概讲一下函数D3DXIntersect吧

D3D SDK该函数声明如下

HRESULT D3DXIntersect(

LPD3DXBASEMESH pMesh,

CONST D3DXVECTOR3 *pRayPos,

CONST D3DXVECTOR3 *pRayDir,

BOOL *pHit,

DWORD *pFaceIndex,

FLOAT *pU,

FLOAT *pV,

FLOAT *pDist,

LPD3DXBUFFER *ppAllHits,

DWORD *pCountOfHits

);

●pMesh指向一个ID3DXBaseMesh的对象,最简单的方式是从.x文件获得,描述了要进行相交检

测的三角面元集合的信息,具体规范参阅direct9 SDK

●pRayPos 指向射线发出点

●pRayDir 指向前面我们辛辛苦苦求出的射线方向的向量

●pHit 当检测到相交图元时,指向一个true,不与任何图元相交则为假

●pU 用于返回重心坐标U分量

●pV返回重心坐标V分量

●pDist 返回射线发出点到相交点的长度

注意:以上红色字体部分均指最近的一个返回结果(即*pDist最小)

●ppAllHits用于如果存在多个相交三角面返回相交的所有结果

●pCountOfHits 返回共有多少个三角形与该射线相交

补充:重心坐标的概念

其中pU和pV用到了重心坐标的概念,下面稍作描述

一个三角形有三个顶点,在迪卡尔坐标系中假设表示为V1(x1,y1,z1),V2(x2,y2,z2),V3(x3,y3,z3),则三角形内任意一点的坐标可以表示为 pV = V1 + U(V2-V1) + V(V3-V1),所以已知三个顶点坐标的情况下,任意一点可用坐标(U,V)来表示,其中 参数U控制V2在结果中占多大的权值,参数V控制V3占多大权值,最终1-U-V控制V1占多大权值,这种坐标定义方式就叫重心坐标。

2..2.2射线三角面相交的数学算法

使用d3d扩展函数,毕竟有时不能满足具体需求,掌握了该方法,我们才能够获得最大的控制自由度,任意修改算法。

已知条件: 射线源点orginPoint,三角形三个顶点v1,v2,v3,射线方向Dir

(均以三维坐标向量形式表示)

算法目的: 判断射线与三角形是否相交,如果相交求出交点的重心坐标(U,V)和射线原点到交点的距离T。

我们可先假设射线与三角形相交则交点(注以下均为向量运算,*数乘,dot(X,Y) X,Y 点乘,cross(X,Y)X,Y叉乘;U,V,T为标量)

则:

IntersectPoint = V1 + U*(V2-V1) + V*(V3-V1) ;

IntersectPoint = originPoint + T*Dir;

所以

orginPoint + T*Dir = V1 + U*(V2-V1) + V*(V3-V1);

整理得:

这是一个简单的线性方程组,若有解则行列式不为0。

根据T,U,V的含义当T>0, 0

解此方程组即可获得我们关心的值,具体解法不再赘述,克莱姆法则就够了(详细见线性代数):射线原点到相交点的距离T,和交点的中心坐标(U,V)。

下面给出Direct 9 SDK示例程序中的实现代码

IntersectTriangle( const D3DXVECTOR3& orig,

const D3DXVECTOR3& dir, D3DXVECTOR3& v0,

D3DXVECTOR3& v1, D3DXVECTOR3& v2,

FLOAT* t, FLOAT* u, FLOAT* v )

{

// 算出两个边的向量

D3DXVECTOR3 edge1 = v1 - v0;

D3DXVECTOR3 edge2 = v2 - v0;

D3DXVECTOR3 pvec;

D3DXVec3Cross( &pvec, &dir, &edge2 );

// 如果det为0,或接近于零则射线与三角面共面或平行,不相交

//此处det就相当于上面的,

FLOAT det = D3DXVec3Dot( &edge1, &pvec );

D3DXVECTOR3 tvec;

if( det > 0 )

{

tvec = orig - v0;

}

else

{

tvec = v0 - orig;

det = -det;

}

if( det < 0.0001f )

return FALSE;

// 计算u并测试是否合法(在三角形内)

*u = D3DXVec3Dot( &tvec, &pvec );

if( *u < 0.0f || *u > det )

return FALSE;

// Prepare to test V parameter

D3DXVECTOR3 qvec;

D3DXVec3Cross( &qvec, &tvec, &edge1 );

//计算u并测试是否合法(在三角形内)

*v = D3DXVec3Dot( &dir, &qvec );

if( *v < 0.0f || *u + *v > det )

return FALSE;

/*计算t,并把t,u,v放缩为合法值(注意前面的t,v,u不同于算法描述中的相应量,乘了一个系数det),注意:由于该步运算需要使用除法,所以放到最后来进行,避免不必要的运算,提高算法效率*/

*t = D3DXVec3Dot( &edge2, &qvec );

FLOAT fInvDet = 1.0f / det;

*t *= fInvDet;

*u *= fInvDet;

*v *= fInvDet;

return TRUE;

}

2.2.3 拾取完成根据获得的中心坐标计算我们关心的常见量,。

根据重心坐标(U,V),我们可以很容易的算出各种相关量比如纹理坐标和交点的差值颜色,假设以纹理坐标为例设V1,V2,V3的纹理坐标分别为T1(tu1,tv1),T2(tu2,tv2),T3(tu3,tv3)则交点的坐标为

IntersectPointTexture = T1 + U(T2-T1) + V(T3-T1)

4、参考文献

【1】Microsoft DirectX 9.0 SDK,microsoft

【2】fast,Minimun Storage Ray/Triangle Intersection,Tomas Moler,Ben Trumbore

第二章 catia草图绘制

CATIA草图绘制 2008-01-13 23:31:21 作者:来源:互联网浏览次数:982 文字大小:【大】【中】【小】 简介:要创建不同外形的特征,必须先绘制二维草图,然后按照不同的方法处理产生要求的特征。其中所谓的绘制草图,就是这里所要说明的草图绘制(Sketcher)。因此草图绘制可以说是创建实体模型过程中一项最基本的技能。... 关键字:CATIA 要创建不同外形的特征,必须先绘制二维草图,然后按照不同的方法处理产生要求的特征。其中所谓的绘制草图,就是这里所要说明的草图绘制(Sketcher)。因此草图绘制可以说是创建实体模型过程中一项最基本的技能。草图绘制作为CATIA V5三维造型的基础,在实体造型中占有非常重要的地位。掌握了二维草图的绘制,在三维实体造型中将会得心应手,甚至可以达到事半功倍的效果。 例如绘制一个长方形的草图使它沿一定方向拉伸一定距离可以得到一个长 方体模型,圆形截面沿一条空间曲线轨迹扫描就可以得到类似电线、电缆的模型。 2.1.1 二维草图工作界面 从桌面双击图标,进入CATIA软件系统。选择【开始】|【机械设计】| 【Sketcher】命令。因为任何一张草图都必须在一个基准平面上才能完成,所以再单击窗口中模型树上如图2.1所示的任意一个平面(也可以直接选择绘图工作区中的三个默认基准平面之一),进入二维草图模块。 图2.1基准平面 注意观察工具栏中【Workbench】(工作台)中出现的【Sketch】(草图) 图标,如果进入的是零件、装配或其它的模块,则会出现对应模块的其它图 标。二维草图工作面和普通的CAD软件工作面有一些相同,属通俗易懂型。如图2.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.鼠标故障无法移动怎么办

CATIA的一些小技巧

CATIA的一些小技巧! 1:如何快速知道当前的CATIA作图区上的零件的放大比例? 答:选中TOOLS----->OPTIONS----->VISUALIZATION----> DISPLAY CURRENT SCALE IN PARALLEL, MODE 的选项. 在屏幕的右下方的数值表示当前作图区内的几何体的显示比例. 2:如何快速定义草图方向? 答:按CTRL键点选在草图中做为X轴的边,再选择草图平面, 然后选择草图功能.草图自动转到所需的方向. 3:如何再SKETCHER 中动态调整尺寸? 答:选中已标注的实体,再按住SHIFT键,,然后拖动实体, 则实体上标注的尺寸值会动态变化. 4:当启动CATIA时,总是会产生一个新的CATPRODUCT 档, 怎样才可以避难? 答:可以在START--->ALL PROGRAMES--->TOOLS---> ENVIRONMENT EDITOR V5R** 中创建一个新的环境变数, NAME:CATNOSTARTDOCUMENTVALUE:YES 就可以改变这种问题了. 5:从CATIA来的有些MODEL 档,在读取时出现 PROJICTCONFLICT 的信息,要怎样才能读取? 答: 在$HOME 的目录下,修改USRENV.DCLS 这个档案, 在其中加入 ATSITE,PRJMODEL=TRUE;这一行就可. (UNIX环境) 6:如何在进入CATIA sketcher workbench 的时候,跳过动画,以加速显示速度? 答:TOOLS--->OPTIONS--->DESPLAY---->NAVIGATION---> NAVIGATION, UNCHECK "ANIMATION DURINGVIEWPOINT MODIFICATION". 就可禁止动画. 7:如何改变系统默认的坐标平面的大小以及颜色? 答:TOOLS--->OPTIONS--->INFRASTRUCTURE------>PART INFRASTRUCRE---->DISPLAY---->DISPLAY IN GEOMETRY AREA---->AXISSYSTEM DISPLAY SIZE (IN MM),把默认值从10改为40.60等等,就可改变基准面的尺寸大小,但颜色只能在界面上GRAPHIC PROPERTIES 工具上直接改了. 8:如何在特征树和实体之间进行切换? 答:大家所知的可能就是在特征树上点击或在屏幕右下角的坐标系上点击.在这里小弟介绍一种

鼠标桌面上不移动怎么办

鼠标桌面上不移动怎么办 鼠标桌面上不移动的解决方法: 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;

CATIA V5 100个使用技巧

CATIA V5 100问 使用CATIAV5,如果要画线或是云形线时,都必须要先画上一个点,可否在平面上任意绘制呢? 答:CATIAV5有一个功能叫做[在依附上工作] 。。 只要开启后就可以达到您的需求。此功能可以使用[工作依附活动性]来开启或是关闭此功能。 请问catia的造形设计中,投影对话框中的G1、G2 是什么意义? 答:当曲线投影至曲面时,可能会造成连续 性的改变,G1、G2用来强制恢复原来 曲面的连续性。其中G1是切线相切连 续,G2是曲率相切连续。举例来说, 有一条曲线投影到圆弧曲面上,本来的 曲线是曲率连续的状态,但是投影后可 能会改变为切线连续的状态,此时可以设定平顺中的G2,与可以允许改变的变异值(默认值是0.001),将投影后的曲线微幅修正回曲率连续,需注意的是只有拥有GSD模块的catia才能够设定,如果只有GS1模块此设定会是变暗无法使用。 catia的的造形设计中的多边线是什么? 答:多边线依照autocad的说法就是聚合线,此多边线将会存在于未封闭实体中。 在catia中要如何检查曲线之间是否有连接?或是有空隙呢?

资料来源于网络,由翱翔https://www.sodocs.net/doc/964425371.html,整理,科研中国https://www.sodocs.net/doc/964425371.html,提供下载。取之于网络,用之于网络,为科学研究事业发展尽一份力。版权归原作者所有,请读者勿用作商业用途,否则后果自负。 科研中国-中国科研网是科研交流网站,希望广大科研工作者、学术期刊社,以及科研院、校、所与科研中国进行合作!欢迎各领域专家和研究生,以及高校科研院所企业的科研人员来科研中国进行交流!Email:chinamaker@https://www.sodocs.net/doc/964425371.html,。 科研中国:https://www.sodocs.net/doc/964425371.html,,让中国引领世界共同进步。

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

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

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

Catia技巧(自己汇总超全实用)

1:如何快速知道当前的CATIA作图区上的零件的放大比例? 答:选中TOOLS----->OPTIONS----->VISUALIZATION----> DISPLAY CURRENT SCALE IN PARALLEL, MODE 的选项. 在屏幕的右下方的数值表示当前作图区内的几何体的显示比例. 2:如何快速定义草图方向? 答:按CTRL键点选在草图中做为X轴的边,再选择草图平面, 然后选择草图功能.草图自动转到所需的方向. 3:如何再SKETCHER 中动态调整尺寸? 答:选中已标注的实体,再按住SHIFT键,,然后拖动实体, 则实体上标注的尺寸值会动态变化. 4:当启动CATIA时,总是会产生一个新的CATPRODUCT 档, 怎样才可以避难? 答:可以在START--->ALL PROGRAMES--->TOOLS---> ENVIRONMENT EDITOR V5R** 中创建一个新的环境变数, NAME:CATNOSTARTDOCUMENTV ALUE:YES 就可以改变这种问题了. 5:从CATIA来的有些MODEL 档,在读取时出现 PROJICTCONFLICT 的信息,要怎样才能读取? 答: 在$HOME 的目录下,修改USRENV.DCLS 这个档案, 在其中加入ATSITE,PRJMODEL=TRUE;这一行就可. (UNIX环境) 6:如何在进入CATIA sketcher workbench 的时候,跳过动画,以加速显示速度? 答:TOOLS--->OPTIONS--->DESPLAY---->NA VIGATION---> NA VIGATION, UNCHECK "ANIMATION DURINGVIEWPOINT MODIFICATION". 就可禁止动画. 7:如何改变系统默认的坐标平面的大小以及颜色? 答:TOOLS--->OPTIONS--->INFRASTRUCTURE------>PART INFRASTRUCRE---->DISPLAY---->DISPLAY IN GEOMETRY AREA---->AXISSYSTEM DISPLAY SIZE (IN MM),把默认值从10改为40.60等等,就可改变基准面的尺寸大小,但颜色只能在界面上GRAPHIC PROPERTIES 工具上直接改了. 8:如何在特征树和实体之间进行切换? 答:大家所知的可能就是在特征树上点击或在屏幕右下角的坐标系上点击.在这里小弟介绍一种方法前提是你的鼠标是三键的) 按住CTRL然后滑动鼠标上的滚轮就OK了. 9:如果你的三键鼠标突然坏了,家里又只有两键的,那怎么办? 我有好办法,其实就是CATIA 的功能. 答:打开 TOOLS--->OPTION--->DEVICES AND VIRTUAL REALITY ;然后在TABEL SUPPORT 里进行编辑就行了. 怎样,看到在你的界面上那些功能表了,这样你就可以继续学习工作了. 10:当你的CATIA里打开多个文档时,有没有快速转换窗口? 答:按住CTRL键,然后按动TAB键就可快速转换窗口了.

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

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

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

用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两种,如果鼠标不动,我们检查是否是鼠标接口接触不良,我们来晃动鼠标,如果鼠标偶尔可以移动说明接触不良,如果晃动鼠标线依然不动,则可以换个接口试试或者换个电脑试试。 第三:鼠标坏了: 要想知道鼠标是否坏了,如果出现鼠标不动这类问题,我们可以进行换个电脑试试。如果换了电脑,鼠标指针依然不动那么可以断定是鼠标坏了。 第四:硬盘驱动问题: 驱动破坏和缺失也会造成鼠标不动的问题,如果出现在这种情况,就要卸载原有驱动,重新拔插让电脑自动识别鼠标并安装驱动。 第五:电压不足,电源功率不够稳定 电压不足的时候,也会出现鼠标不动的问题。

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

大漠插件后台找图、自动获取坐标窗口句柄鼠标多点左单击 脚本 一、准备工作 第一步:下载大漠插件、解压,运行“注册大漠插件到系统.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

catia_绘制草图技巧

1、教程:CATIA V5R10机械设计范例教程 2、零件设计的草图设计中没有专门对象捕捉功能,可以用约束工具条和鼠标贴近对象据颜色变化来选择。catia选择对象是通过鼠标靠近根据颜色变化来选择对象的!! 3、激活约束创建开关方法:a、利用“草图工具条”如下图。b、“工具”-“选项”-“机械设计”-“草图绘制器”选中“约束”里的两个选项(所有设置都可以通过“工 具”-“选项”) 4、修剪圆与直线相切的直线(将切点一边部分修剪掉):a、点“修剪”图标,按ctrl键选中想修剪的线,然后移动光标到切点,最后点左键(这种方法不行,找不到切点)b、可将直线打断,点“打断”图标,然后点直线,再点圆就可将直线从切点打断,最后选中切点一边的直线按“delete”键删掉即可。一般“修剪”图标很少用,多用“打断”图标!! 简单:选中直接点“橡皮” 5、在需要选择某个草图时可以在绘图区中选,也可以在历史树中选。比如在做slot沟槽练习时,选完轮廓线后,中心线即扫描线想选择刚才画Rib(筋)过程的中心线,但此时在绘图区找不到了,而从历史树中可以方便的找到!!一般在历史树中选择对象更方便!! 6、点历史树的“树枝”会使绘图区的对象变黑,再点会变过来!! 7、注意“筋”(Rib)、“沟槽”(slot)与“放样”(Loft或Multi-sections Solit )的区别,筋和沟槽需建立轮廓线和中心线,然后轮廓线沿着中心线扫描;而放样是建立物体的多个截面,然后将截面上的点相连,构成实体,一般要建多个参考面!!!“移去放样”和放样相对!! 8、catia“零件设计”中可以进行布尔运算,先插入一个“body”(称“实体”或“几何体”)进行建模,然后即可以将两个模型进行布尔运算!!CATIA v5的布尔运算是这么多软件当中是数一数二的,做实体设计的最高境界就是全部用布尔运算做出来,这样的数模可编辑修改性是最好的. 9、布尔操作中assembly和add的区别:當 body 是除料的屬性時,以 asm 運算則是remove , 以 add 運算則是 add 所以只有在此情形有用,這個用法是幫助以實體外形做將公模做個 body, 母模做個 body 時,在公模的部份不用去轉換指令,可以直接以除料的指令完成公模,接著以 asm 或是 remoe 的布林運算將成品完成以 remove 的方式將母模完成以 add 的方式將公模完成

鼠标指针飘忽不定怎么办

鼠标指针飘忽不定怎么办 鼠标指针飘忽不定的解决方法一: 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.sodocs.net/doc/964425371.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 复制

Direct3D中实现图元的鼠标拾取

Direct3D中实现图元的鼠标拾取 查看文章 Direct3D中实现图元的鼠标拾取 2007-05-05 15:46 3D交互图形应用程序中,常常要用鼠标去选择图形,其实现的机制基于鼠标拾取算法。本文主要讲述如何在D3D中实现图元的鼠标拾取。为了讨论简单,本文假定读者理解D3D 坐标变换流程和基本的图形学知识,如果阅读有困难请参考相关资料。 1、什么是拾取,拾取能做什么, 首先,拾取操作指当我们在屏幕上用鼠标点击某个图元应用程序能返回该图元的一个标志和某些相关信息。有图形程序设计经验的人都知道,有这些信息就表示我们有了对该图元的控制权,我们可以删除,可以编辑,可以任意对待该图元,至于你到底想干什么,就是阁下自己的事了^_^。 2、拾取操作的步骤和实现 拾取算法的思想很简单:得到鼠标点击处的屏幕坐标,通过投影矩阵和观察矩阵把该坐标转换为通过视点和鼠标点击点的一条射入场景的光线,该光线如果与场景模型的三角形相交(本文只处理三角形图元),则获取该相交三角形的信息。本文讲述的方法除可以得到三角形的一个索引号以外还可以得到相交点的重心坐标。 从数学角度来看,我们只要得到射线的方向矢量和射线的出射点,我们就具备了判断射线与空间一个三角面是否相交的条件,本文主要讨论如何获得这些条件,并描述了射线三角面相交判断算法和D3D的通常实现方法。根据拾取操作的处理顺序,大概可以依次分为以下几个步骤 2.1( 变换并获得通过视点和屏幕上点击点的射线矢量(Dir) 详细介绍之前,为了大家方便理解,我们要先简单说一下d3d坐标转换的大概流程,如下图:

所以我们要通过一系列的反变换,得到我们关心的值在世界坐标中的表示。 2.1.1 确定鼠标选取点的屏幕坐标 这一步是非常简单的Windows给我们提供了API来完成屏幕坐标的获取,使用GetCursorPos获得鼠标指针位置,然后再利用ScreenToClient转换坐标到客户区 坐标系(以窗口视区左上角为坐标原点,单位为像素),设该坐标为(POINT screenPt)。 2.1.2 得到Dir在观察坐标空间内的表示 在观察坐标系中,Dir是一条从观察坐标原点出发的射线,所以我们只需要再 确定一个该射线经过的点,就可以得到它在观察坐标系中的表示。假设我们要求的 射线上的另外一点为该射线与透视投影平截头体近剪切面的交点,针对最普遍的透 视投影而言,透视投影平截头体经投影变换后,变成一个1/2立方体(请允许我这 么叫^_^,因为它的大小为一个正方体的一半,x,y方向边长为2,z方向为1)如图: 投影坐标系以近剪切面中心为坐标原点,该立方体从z轴负向看过去与图形程 序视区相对应,最终近剪切面(前剪切面)上一点与屏幕坐标之间的对应关系如下图 所示:

JavaScript 获取鼠标点击位置坐标

JavaScript 获取鼠标点击位置坐标 在一些DOM操作中我们经常会跟元素的位置打交道,鼠标交互式一个经常用到的方面,令人失望的是不同的浏览器下会有不同的结果甚至是有的浏览器下没结果,这篇文章就上鼠标点击位置坐标获取做一些简单的总结,没特殊声明代码在IE8,FireFox,Chrome下进行测试兼容 鼠标点击位置坐标相对于屏幕 如果是涉及到鼠标点击确定位置相对比较简单,获取到鼠标点击事件后,事件screenX,screenY获取的是点击位置相对于屏幕的左边距与上边距,不考虑iframe因素,不同浏览器下表现的还算一致。function getMousePos(event) { var e = event || window.event; return {'x':e.screenX,'y':screenY} } 相对浏览器窗口 简单代码即可实现,然而这是还不够,因为绝大多数情况下我们希望获取鼠标点击位置相对于浏览器窗口的坐标,event的clientX,clientY属性分别表示鼠标点击位置相对于文档的左边距,上边距。于是类似的我们写出了这样的代码function getMousePos(event) { var e = event || window.event; return {'x':e.clientX,'y':clientY} } 相对文档 简单测试也没什么问题,但是clientX与clientY获取的是相对于当前屏幕的坐标,忽略页面滚动因素,这在很多条件下很有用,但当我们需要考虑页面滚动,也就是相对于文档(body 元素)的坐标时怎么办呢?加上滚动的位移就可以了,下边我们试试怎么计算页面滚动的位移。 其实在Firefox下问题会简单很多,因为Firefox支持属性pageX,与pageY属性,这两个属性已经把页面滚动计算在内了。 在Chrome可以通过document.body.scrollLeft,document.body.scrollTop计算出页面滚动位移,而在IE下可以通过document.documentElement.scrollLeft ,document.documentElement.scrollTop function getMousePos(event) { var e = event || window.event; var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; var scrollY = document.documentElement.scrollTop || document.body.scrollTop; var x = e.pageX || e.clientX + scrollX; var y = e.pageY || e.clientY + scrollY; //alert('x: ' + x + '\ny: ' + y); return { 'x': x, 'y': y }; } getBoundingClientRect() 来获取页面元素的位置

鼠标无法移动该怎么办

鼠标无法移动该怎么办 鼠标是人们日常使用的电脑外设,那你们知道关于鼠标无法移动的情况吗?那么下面就由小编来给你们说说鼠标无法移动的解决方法吧,希望可以帮到你们哦! 鼠标无法移动的解决方法一: 1、鼠标连线接触不良 鼠标接口一般分为USB或者PS/2接口,其中PS/2是台式电脑最常用的接口,USB接口用在笔记本上比较多,并且USB接口鼠标是通用的,如果发现鼠标动不了,首先我们可以简单的晃动下鼠标线是否接触不良,如果晃动过程鼠标偶尔可以移动说明接触不良,如果晃动鼠标线依然不动,则可以换个接口试试或者换个电脑试试。需要注意的是:PS/2接口鼠标拔掉再重新插入电脑需要重新启动电脑才可以识别,这点大家需要注意下。 2、鼠标坏了 如果鼠标由于不小心摔地上了,或者其他碰撞导致的鼠标动

不了则多数可能是鼠标坏了,首先可以采用上面方法试试,无效的话基本是鼠标出问题,有兴趣的朋友不妨死马当活马医,拆开维修试试。 3、成像表面不兼容 该问题多见于笔记本电脑用户,鼠标平时使用正常,但是在外出办公时,不管如何移动鼠标,屏幕上的指针就是纹丝不动或动的断断续续。造成这一现象的原因,是因为鼠标引擎无法在用户目前使用表面上捕捉到可以让鼠标进行定位的细节所造成。无论光学鼠标还是激光鼠标,都存在着对部分表面不兼容的现象。比如透明玻璃、大理石表面或部分纯色表面都会出现无法移动的现象。 解决方法这种鼠标不动了的方法,其实很简单,只要将鼠标放置在其它表面,比如白纸或裤腿上使用,即可解决该问题。用户在遇到此类问题时,一定不要心慌,往往将鼠标换个地方,就可以避免在客户面前失态。 4、无线鼠标无法移动 相比于有线鼠标,无线鼠标出现无法移动的现象较多,鼠标上的电源指示灯和底部光源均正常亮起,但是移动鼠标屏幕指针无法移动。造成这种鼠标不动了的原因,可能是由于鼠标与电脑的无线连

相关主题