做网站带来好处,秦皇岛网签查询系统,泰安建设局网站,wordpress模板添加授权相机这部分比想象当中要难缠。现在也不是特别清楚#xff0c;只是根据教程XNARecipes中第二章的2、3两节做一些必要的记录。 最简单的例子#xff1a;相机在初始位置#xff0c;绕着Up向量
相机在(0,0,0)初始坐标#xff0c;朝(0,0,-1) Forward方向观察#xff0c;以默认…相机这部分比想象当中要难缠。现在也不是特别清楚只是根据教程XNARecipes中第二章的2、3两节做一些必要的记录。 最简单的例子相机在初始位置绕着Up向量
相机在(0,0,0)初始坐标朝(0,0,-1) Forward方向观察以默认的(0,1,0) Up向量作为向上方向。在这个情况中可以使用以下代码 1: Vector3 cameraPosition new Vector3(0, 0, 0); 2: Vector3 cameraTarget new Vector3(0, 0, -1); 3: Vector3 cameraUpVector new Vector3(0, 1, 0); 4: 5: viewMatrix Matrix.CreateLookAt(cameraPosition, cameraTarget, cameraUpVector); Vector3 direction camaraTarget – cameraPosition (0, 0, -1) 这一句虽然在这里很显然但之后的很多问题就是跟这个direction有关。
如果创建一个绕Up向量旋转45度的View矩阵。假设头就是相机只要向右旋转45度向右看。当计算新View矩阵时Position向量和Up向量保持不变但Target向量变了。可以通过将使用45度旋转“转换”默认的(0,0,-1) Target向量获取新Target向量。这意味着新的Target向量是初始Target向量的旋转版本。下面是代码 1: Matrix cameraRotation Matrix.CreateRotationY(MathHelper.PiOver4); 2: Vector3 cameraPosition new Vector3(0, 0, 0); 3: Vector3 cameraUpVector new Vector3(0, 1, 0); 4: Vector3 cameraOriginalTarget new Vector3(0, 0, -1); 5: 6: Vector3 cameraRotatedTarget Vector3.Transform(cameraOriginalTarget, cameraRotation); 7: viewMatrix Matrix.CreateLookAt(cameraPosition, cameraRotatedTarget, cameraUpVector); 由于Position没变那么Vector3 direction camaraTarget – cameraPosition 不再是 (0, 0, -1)。 也就是你把头转过去看旁边的东西了而不再是正前方的某个东西 第二个例子相机在初始位置任意旋转
现在进一步来看。你想使相机绕着任意轴旋转而不是绕着Up向量。例如绕着(1,0,0) Right轴旋转45度假设头就是相机这就相当于抬起头45度看天空。和前面一个例子一样Target向量会变化Position向量保持不变。
但是这种情况中Up向量会发生变化头仰起了嘛。在前面的例子中你将头部转向右边Up向量并不会变化。这个例子中将头部向上旋转Up向量和Target向量都要发生改变。
变换Up向量和变换Target向量的方法是一样的通过旋转矩阵变换初始Up向量获取新的Up向量。下面是代码 1: Matrix cameraRotation Matrix.CreateRotationX(MathHelper.PiOver4); 2: Vector3 cameraPosition new Vector3(0, 0, 0); 3: Vector3 cameraOriginalUpVector new Vector3(0, 1, 0); 4: Vector3 cameraOriginalTarget new Vector3(0, 0, -1); 5: 6: Vector3 cameraRotatedTarget Vector3.Transform(cameraOriginalTarget, cameraRotation); 7: Vector3 cameraRotatedUpVector Vector3.Transform(cameraOriginalUpVector, cameraRotation); 8: viewMatrix Matrix.CreateLookAt(cameraPosition, cameraRotatedTarget, cameraRotatedUpVector); 这里的“任意”旋转矩阵只是一个简单绕x轴的旋转。这个代码也可以处理任何旋转例如下面的这个情况它组合了三根轴上的旋转。下面的代码生成一个矩阵这个矩阵是绕z轴–45度和y轴22.5度x轴90度旋转的组合 1: Matrix cameraRotation Matrix.CreateRotationX(MathHelper.PiOver2)* Matrix.CreateRotationY(MathHelper.Pi/8.0f)* Matrix.CreateRotationZ(-MathHelper.PiOver4); 但这时要小心了别把脖子扭了。 Vector3 direction camaraTarget – cameraPosition 不是 (0, 0, -1)。为什么强调这个direction虽然到现在为止还体现不出什么因为没有涉及到移动。这也是刚开始看教程时容易忽略的一点以至于看到后面糊涂了。
这里要说明一点顺时针转是正逆时针转是负。还有从人的视觉出发只要Up向量大致朝上物体是不会颠倒的。这也是后面Quake式相机只有左右和上下的旋转。也就是抬头低头看左看右没有歪着脖子的。 第三个例子相机在指定位置任意旋转
对于这个例子教程上的解释不大明白。特别是按照前两个例子的顺序学下来。 现在必须要有一个direction方向。先看代码 1: Matrix cameraRotation Matrix.CreateRotationX(MathHelper.PiOver2)* Matrix.CreateRotationY(MathHelper.Pi/8.0f)*Matrix.CreateRotationZ(-MathHelper.PiOver4); 2: Vector3 cameraPosition new Vector3(10, 20, 30); 3: Vector3 cameraOriginalTarget new Vector3(0, 0, -1); 4: Vector3 cameraOriginalUpVector new Vector3(0, 1, 0); 5: 6: Vector3 cameraRotatedTarget Vector3.Transform(cameraOriginalTarget, cameraRotation); 7: Vector3 cameraFinalTarget cameraPosition cameraRotatedTarget; 8: 9: Vector3 cameraRotatedUpVector Vector3.Transform(cameraOriginalUpVector, cameraRotation); 10: Vector3 cameraFinalUpVector cameraPosition cameraRotatedUpVector; 11: 12: viewMatrix Matrix.CreateLookAt(cameraPosition, cameraFinalTarget, cameraFinalUpVector); Position是在位置102030。代码中有一个cameraOriginalTarget注意这个Target不是一个点而是一个矢量方向。为什么呢一般来讲设置观察矩阵需要一个视点。假如cameraOriginalTarget代表的是一个点那么direction -10-20-31。因为对于前两个例子00-1既可以表示视点也可以表示方向Position在初始位置。所以当看到Vector3 cameraRotatedTarget Vector3.Transform(cameraOriginalTarget, cameraRotation); 的时候也能够理解视点的位置从00-1变成了xyz方向也从00-1改变到xyz。
但在这个例子中怎么理解这两行 1: Vector3 cameraRotatedTarget Vector3.Transform(cameraOriginalTarget, cameraRotation); 2: Vector3 cameraFinalTarget cameraPosition cameraRotatedTarget; 为什么会有cameraRotatedTarget还有cameraFinalTarget。directioncameraFinalTarget – cameraPosition cameraRotatedTarget
而cameraRotatedTarget是由cameraOriginalTarget变换过来的。我们知道如果cameraOriginalTarget是视点的话那么初始的方向是 direction cameraOriginalTarget - cameraPosition -10-20-31。 变换的时候Vector3 cameraRotatedTarget Vector3.Transform(cameraOriginalTarget, cameraRotation); cameraOriginalTarget参数所在的位置应该是-10-20-31才对。
从上面的反证中可以得出结论cameraOriginalTarget代表一个方向不代表视点。不像前两个例子中cameraOriginalTarget既是视点又是方向。理解了这个对于 cameraRotatedUpVector和cameraFinalUpVector也能理解了。 到这里看第二节教程所带的源代码才能看明白。特别是自己写的时候出现问题时也能够知道是哪里出了问题。下面是自己写的代码 1: protected override void Initialize() 2: { 3: // TODO: Add your initialization logic her 4: moveSpeed 0.02f; 5: 6: float fov MathHelper.PiOver4; 7: float aspect GraphicsDevice.DisplayMode.AspectRatio; 8: float nearClip 0.5f; 9: float farClip 100.0f; 10: projMat Matrix.CreatePerspectiveFieldOfView(fov, aspect, nearClip, farClip); 11: 12: camPosition new Vector3(30, 30, 30); 13: cameraRotation Matrix.CreateRotationX(-MathHelper.Pi / 8.0f) * Matrix.CreateRotationY(-MathHelper.Pi / 8.0f); 14: UpadteViewMatrix(); 15: base.Initialize(); 16: } 先是Initialize()设置好投影矩阵相机的位置旋转的角度 1: private void UpadteViewMatrix() 2: { 3: Vector3 originalForward new Vector3(-1.7f, -1, -1); 4: Vector3 originalUp new Vector3(0, 1, 0); 5: 6: Vector3 rotatedForward Vector3.Transform(originalForward, cameraRotation); 7: Vector3 rotatedUp Vector3.Transform(originalUp, cameraRotation); 8: 9: Vector3 finalLook camPosition rotatedForward; 10: 11: viewMat Matrix.CreateLookAt(camPosition, finalLook, rotatedUp); 12: } 这里直接将originalTarget这样容易混淆的名字改成originalForward而且是-1.7f-1-1旋转变换之后差不多就是-1-1-1的方向也。因为相机的初始位置是303030而我的观察方向是要看向坐标源点。 1: private void MoveCameraPosition() 2: { 3: Vector3 originalForward new Vector3(-1.7f, -1, -1); 4: Vector3 rotatedForward Vector3.Transform(originalForward, cameraRotation); 5: camPosition moveSpeed * rotatedForward; 6: 7: UpadteViewMatrix(); 8: 9: } 这里camPosition也是朝着源点向前移动变化。 文章转载自: http://www.morning.gtmgl.cn.gov.cn.gtmgl.cn http://www.morning.fhtmp.cn.gov.cn.fhtmp.cn http://www.morning.wmdbn.cn.gov.cn.wmdbn.cn http://www.morning.nhgfz.cn.gov.cn.nhgfz.cn http://www.morning.bnbzd.cn.gov.cn.bnbzd.cn http://www.morning.alive-8.com.gov.cn.alive-8.com http://www.morning.neletea.com.gov.cn.neletea.com http://www.morning.nccqs.cn.gov.cn.nccqs.cn http://www.morning.woyoua.com.gov.cn.woyoua.com http://www.morning.ntqgz.cn.gov.cn.ntqgz.cn http://www.morning.mxmtt.cn.gov.cn.mxmtt.cn http://www.morning.lfmwt.cn.gov.cn.lfmwt.cn http://www.morning.kqpxb.cn.gov.cn.kqpxb.cn http://www.morning.muzishu.com.gov.cn.muzishu.com http://www.morning.svtxeu.com.gov.cn.svtxeu.com http://www.morning.yrbq.cn.gov.cn.yrbq.cn http://www.morning.lkbyj.cn.gov.cn.lkbyj.cn http://www.morning.ftntr.cn.gov.cn.ftntr.cn http://www.morning.yjmns.cn.gov.cn.yjmns.cn http://www.morning.gxtfk.cn.gov.cn.gxtfk.cn http://www.morning.srbmc.cn.gov.cn.srbmc.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.rybr.cn.gov.cn.rybr.cn http://www.morning.taojava.cn.gov.cn.taojava.cn http://www.morning.bqxxq.cn.gov.cn.bqxxq.cn http://www.morning.sfswj.cn.gov.cn.sfswj.cn http://www.morning.pzdxg.cn.gov.cn.pzdxg.cn http://www.morning.chhhq.cn.gov.cn.chhhq.cn http://www.morning.ygztf.cn.gov.cn.ygztf.cn http://www.morning.rdkqt.cn.gov.cn.rdkqt.cn http://www.morning.mxlwl.cn.gov.cn.mxlwl.cn http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.qgcfb.cn.gov.cn.qgcfb.cn http://www.morning.nmkbl.cn.gov.cn.nmkbl.cn http://www.morning.dnqlba.cn.gov.cn.dnqlba.cn http://www.morning.hrypl.cn.gov.cn.hrypl.cn http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn http://www.morning.lqtwb.cn.gov.cn.lqtwb.cn http://www.morning.rxrw.cn.gov.cn.rxrw.cn http://www.morning.ldpjm.cn.gov.cn.ldpjm.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.skrxp.cn.gov.cn.skrxp.cn http://www.morning.xphls.cn.gov.cn.xphls.cn http://www.morning.ltpzr.cn.gov.cn.ltpzr.cn http://www.morning.fllfz.cn.gov.cn.fllfz.cn http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn http://www.morning.fxzlg.cn.gov.cn.fxzlg.cn http://www.morning.ydxx123.cn.gov.cn.ydxx123.cn http://www.morning.gsksm.cn.gov.cn.gsksm.cn http://www.morning.cmldr.cn.gov.cn.cmldr.cn http://www.morning.rpwm.cn.gov.cn.rpwm.cn http://www.morning.tlfyb.cn.gov.cn.tlfyb.cn http://www.morning.ydwnc.cn.gov.cn.ydwnc.cn http://www.morning.lfbsd.cn.gov.cn.lfbsd.cn http://www.morning.clccg.cn.gov.cn.clccg.cn http://www.morning.lmqw.cn.gov.cn.lmqw.cn http://www.morning.iiunion.com.gov.cn.iiunion.com http://www.morning.hcszr.cn.gov.cn.hcszr.cn http://www.morning.mxdiy.com.gov.cn.mxdiy.com http://www.morning.wfqcs.cn.gov.cn.wfqcs.cn http://www.morning.nstml.cn.gov.cn.nstml.cn http://www.morning.nnykz.cn.gov.cn.nnykz.cn http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn http://www.morning.fyglr.cn.gov.cn.fyglr.cn http://www.morning.wwxg.cn.gov.cn.wwxg.cn http://www.morning.kflbf.cn.gov.cn.kflbf.cn http://www.morning.hmlpn.cn.gov.cn.hmlpn.cn http://www.morning.pfnrj.cn.gov.cn.pfnrj.cn http://www.morning.dbjyb.cn.gov.cn.dbjyb.cn http://www.morning.kbdjn.cn.gov.cn.kbdjn.cn http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.gbhsz.cn.gov.cn.gbhsz.cn http://www.morning.rnpt.cn.gov.cn.rnpt.cn http://www.morning.rnyhx.cn.gov.cn.rnyhx.cn http://www.morning.yrbq.cn.gov.cn.yrbq.cn http://www.morning.xphls.cn.gov.cn.xphls.cn http://www.morning.hnpkr.cn.gov.cn.hnpkr.cn http://www.morning.qbdsx.cn.gov.cn.qbdsx.cn http://www.morning.dmsxd.cn.gov.cn.dmsxd.cn http://www.morning.jxhlx.cn.gov.cn.jxhlx.cn