{"id":1068,"date":"2016-09-17T10:49:37","date_gmt":"2016-09-17T08:49:37","guid":{"rendered":"http:\/\/darksun190.cn\/?p=1068"},"modified":"2016-09-17T10:49:37","modified_gmt":"2016-09-17T08:49:37","slug":"sharpdx%e7%9a%84camera%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"http:\/\/darksun190.cn\/blog\/?p=1068","title":{"rendered":"SharpDX\u7684Camera\u5b9e\u73b0"},"content":{"rendered":"<p>&lt;Introduction to 3D Game Programming with Direct3D 11.0&gt;\u7b2c15\u7ae0Camera\u7c7b\u7684C#(SharpDX)\u5b9e\u73b0\u3002<\/p>\n<pre class=\"lang:c# decode:true  \" title=\"Camera\">using System;\nusing SharpDX;\n\nnamespace SharpDX_Study_001\n{\n    class Camera\n    {\n        public Camera()\n        {\n            mPosition = Vector3.Zero;\n            mRight = Vector3.UnitX;\n            mUp = Vector3.UnitY;\n            mLook = Vector3.UnitZ;\n            SetLens(0.2f * SharpDX.MathUtil.Pi, 1.0f, 1.0f, 1000.0f);\n        }\n        public Vector4 PositionXM\n        {\n            get\n            {\n                return new Vector4(mPosition, 0);\n            }\n        }\n        public Vector3 Position\n        {\n            get\n            {\n                return mPosition;\n            }\n            set\n            {\n                mPosition = value;\n            }\n        }\n        public Vector4 RightXM\n        {\n            get\n            {\n                return new Vector4(mRight, 0);\n            }\n        }\n        public Vector4 UpXM\n        {\n            get\n            {\n                return new Vector4(mUp, 0);\n            }\n        }\n        public Vector4 LookXM\n        {\n            get\n            {\n                return new Vector4(mLook, 0);\n            }\n        }\n        public Vector3 Right\n        {\n            get\n            {\n                return mRight;\n            }\n        }\n        public Vector3 Look\n        {\n            get\n            {\n                return mLook;\n            }\n        }\n        public Vector3 Up\n        {\n            get\n            {\n                return mUp;\n            }\n        }\n        public float NearZ\n        {\n            get\n            {\n                return mNearZ;\n            }\n        }\n        public float FarZ\n        {\n            get\n            {\n                return mFarZ;\n            }\n        }\n        public float Aspect\n        {\n            get\n            {\n                return mAspect;\n            }\n        }\n        public float FovY\n        {\n            get\n            {\n                return mFovY;\n            }\n        }\n        public float FovX\n        {\n            get\n            {\n                float halfWidth = 0.5f * NearWindowWidth;\n                return 2.0f * Convert.ToSingle(Math.Atan(halfWidth \/ mNearZ));\n            }\n        }\n        public float NearWindowWidth\n        {\n            get\n            {\n                return mAspect * mNearWindowHeight;\n            }\n        }\n        public float NearWindowHeight\n        {\n            get\n            {\n                return mNearWindowHeight;\n            }\n        }\n        public float FarWindowWidth\n        {\n            get\n            {\n                return mAspect * mFarWindowHeight;\n            }\n        }\n        public float FarWindowHeight\n        {\n            get\n            {\n                return mFarWindowHeight;\n            }\n        }\n\n        \/\/\/ &lt;summary&gt;\n        \/\/\/ Set frustum.\n        \/\/\/ &lt;\/summary&gt;\n        \/\/\/ &lt;param name=\"fovY\"&gt;&lt;\/param&gt;\n        \/\/\/ &lt;param name=\"aspect\"&gt;&lt;\/param&gt;\n        \/\/\/ &lt;param name=\"zn\"&gt;&lt;\/param&gt;\n        \/\/\/ &lt;param name=\"zf\"&gt;&lt;\/param&gt;\n        public void SetLens(float fovY, float aspect, float zn, float zf)\n        {\n            \/\/ cache properties\n            mFovY = fovY;\n            mAspect = aspect;\n            mNearZ = zn;\n            mFarZ = zf;\n\n            mNearWindowHeight = 2.0f * mNearZ * Convert.ToSingle(Math.Tan(0.5f * mFovY));\n            mFarWindowHeight = 2.0f * mFarZ * Convert.ToSingle(Math.Tan(0.5f * mFovY));\n\n            mProj = Matrix.PerspectiveFovLH(mFovY, mAspect, mNearZ, mFarZ);\n        }\n\n        \/\/       \/\/ Define camera space via LookAt parameters.\n        public void LookAt(Vector4 pos, Vector4 target, Vector4 worldUp)\n        {\n            Vector3 L = new Vector3(pos.X, pos.Y, pos.Z);\n            Vector3 T = new Vector3(target.X, target.Y, target.Z);\n            Vector3 U = new Vector3(worldUp.X, worldUp.Y, worldUp.Z);\n            LookAt(L, T, U);\n        }\n        public void LookAt(Vector3 pos, Vector3 target, Vector3 up)\n        {\n            mPosition = pos;\n            mLook = Vector3.Normalize(target - pos);\n            mRight = Vector3.Normalize(Vector3.Cross(up, mLook));\n            mUp = Vector3.Cross(mLook, mRight);\n        }\n        public Matrix View\n        {\n            get\n            {\n                return mView;\n            }\n        }\n        public Matrix Proj\n        {\n            get\n            {\n                return mProj;\n            }\n        }\n        public Matrix ViewProj\n        {\n            get\n            {\n                return View * Proj;\n            }\n        }\n        \/\/ Strafe\/Walk the camera a distance d.\n        public void Strafe(float d)\n        {\n            \/\/ mPosition += d*mRight\n            Vector4 s = new Vector4(d);\n\n            var nPos = (s * RightXM + PositionXM);\n            mPosition = new Vector3(nPos.X, nPos.Y, nPos.Z);\n        }\n        public void Walk(float d)\n        {\n            \/\/ mPosition += d*mLook\n            Vector4 s = new Vector4(d);\n            var nPos = (s * LookXM + PositionXM);\n            mPosition = new Vector3(nPos.X, nPos.Y, nPos.Z);\n        }\n\n        \/\/ Rotate the camera.\n        public void Pitch(float angle)\n        {\n            \/\/ Rotate up and look vector about the right vector.\n\n            Matrix R = Matrix.RotationAxis(mRight, angle);\n            mUp = Vector3.TransformNormal(mUp, R);\n            mLook = Vector3.TransformNormal(mLook, R);\n        }\n        public void RotateY(float angle)\n        {\n            \/\/ Rotate the basis vectors about the world y-axis.\n\n            Matrix R = Matrix.RotationY(angle);\n            mRight = Vector3.TransformNormal(mRight, R);\n            mUp = Vector3.TransformNormal(mUp, R);\n            mLook = Vector3.TransformNormal(mLook, R);\n        }\n\n        \/\/ After modifying camera position\/orientation, call to rebuild the view matrix.\n        public void UpdateViewMatrix()\n        {\n            var R = mRight;\n            var U = mUp;\n            var L = mLook;\n            var P = mPosition;\n\n            \/\/ Keep camera's axes orthogonal to each other and of unit length.\n            L = Vector3.Normalize(L);\n            U = Vector3.Normalize(Vector3.Cross(mLook, mRight));\n\n            \/\/ U, L already ortho-normal, so no need to normalize cross product.\n            R = Vector3.Cross(U, L);\n\n            \/\/ Fill in the view matrix entries.\n            float x = -Vector3.Dot(P, R);\n            float y = -Vector3.Dot(P, U);\n            float z = -Vector3.Dot(P, L);\n\n            mRight = R;\n            mUp = U;\n            mLook = L;\n\n            mView.Column1 = new Vector4(mRight, x);\n            mView.Column2 = new Vector4(mUp, y);\n            mView.Column3 = new Vector4(mLook, z);\n            mView.Column4 = Vector4.UnitW;\n        }\n\n\n        private Vector3 mPosition;\n\n        private Vector3 mRight;\n\n        private Vector3 mUp;\n\n        private Vector3 mLook;\n\n\n        \/\/ Cache frustum properties.\n        float mNearZ;\n        float mFarZ;\n        float mAspect;\n        float mFovY;\n        float mNearWindowHeight;\n        float mFarWindowHeight;\n\n        Matrix mView;\n        Matrix mProj;\n\n    }\n}\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&lt;Introduction to 3D Game Programming with Direct3D 1 &hellip; <a href=\"http:\/\/darksun190.cn\/blog\/?p=1068\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201cSharpDX\u7684Camera\u5b9e\u73b0\u201d<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-1068","post","type-post","status-publish","format-standard","hentry","category-cs"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1068"}],"version-history":[{"count":0,"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1068\/revisions"}],"wp:attachment":[{"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1068"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/darksun190.cn\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}