{"id":26,"date":"2020-08-10T09:50:17","date_gmt":"2020-08-10T09:50:17","guid":{"rendered":"https:\/\/noirccc.net\/blog\/?p=26"},"modified":"2023-05-18T00:28:55","modified_gmt":"2023-05-18T00:28:55","slug":"%e3%80%90unity%e3%80%91%e5%85%bc%e5%ae%b9vr%e7%9a%84%e9%95%9c%e5%ad%90%e6%95%88%e6%9e%9c","status":"publish","type":"post","link":"https:\/\/noirccc.net\/blog\/zh\/posts\/26","title":{"rendered":"\u3010Unity\u3011\u517c\u5bb9VR\u7684\u955c\u5b50\u6548\u679c"},"content":{"rendered":"\n<p>The following two methods are tested under environment: Unity 2019.2.14 + SteamVR SDK, Built-in RP.<\/p>\n\n\n\n<h2>\u65b9\u6848 A. Render Texture<\/h2>\n\n\n\n<p>\u7b80\u5355\u7c97\u66b4\u4f20\u7edf\u827a\u80fd\u3002\u53ea\u8981\u5728\u65b9\u5757\u4e2d\u95f4\u653e\u4e2a\u671d\u524d\u7684\u76f8\u673a\uff0c\u8ba9\u65b9\u5757\u663e\u793a\u76f8\u673a\u62cd\u5230\u7684\u753b\u9762\uff0c\u5c31\u80fd\u8fbe\u5230\u955c\u5b50\u7684\u6548\u679c\u4e86\u3002<\/p>\n\n\n\n<ol>\n<li>\u65b0\u5efa Render Texture \u8d34\u56fe\uff0c\u547d\u540d\u4e3a\u300cMirror_tex\u300d\u3002<\/li>\n\n\n\n<li>\u573a\u666f\u5185\u65b0\u5efa\u76f8\u673a\uff0c\u547d\u540d\u4e3a\u300cMirrorCamera\u300d\uff0c\u89c6\u91ce90\u00b0\u3002\u628a\u300cMirror_tex\u300d\u8d34\u56fe\u7ed1\u5b9a\u5230\u76f8\u673a\u7684 \u201cTarget Texture\u201d \u680f\uff0c\u8fd9\u6837\u5c31\u80fd\u8ba9\u76f8\u673a\u628a\u753b\u9762\u4f20\u9012\u7ed9\u300cMirror_tex\u300d\u8d34\u56fe\u3002<\/li>\n\n\n\n<li>\u65b0\u5efa\u6750\u8d28\uff0c\u547d\u540d\u4e3a\u300cMirror_mat\u300d\uff0cshader \u8bbe\u201c Unlit\u2192Texture \u201d\uff0c\u628a\u300cMirror_tex\u300d\u8d34\u56fe\u7ed1\u5b9a\u5230\u8fd9\u4e2a\u6750\u8d28\u7684\u8d34\u56fe\u680f\u3002<\/li>\n\n\n\n<li>\u5728\u573a\u666f\u5185\u65b0\u5efa\u4e00\u4e2a3D\u7269\u4f53\u2192 Quad \u4f5c\u4e3a\u955c\u5b50\u6a21\u578b\uff0c\u628a\u6750\u8d28\u8bbe\u4e3a\u300cMirror_mat\u300d\uff0c\u7136\u540e\u628a Transform\u2192X Scale \u8bbe\u4e3a\u201c-1\u201d\uff0c\u8c03\u6574\u76f8\u673a\u4f4d\u7f6e\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u8fd9\u6837\u5c31\u80fd\u5728\u6a21\u578b\u4e0a\u663e\u793a\u300cMirrorCamera\u300d\u6355\u6349\u5230\u7684\u753b\u9762\u4e86\u3002<\/p>\n\n\n\n<h2>\u65b9\u6848 B. Vive Stereo Rendering Toolket<\/h2>\n\n\n\n<p>\u4f7f\u7528 Vive Stereo Rendering Toolket \u63d0\u4f9b\u7684\u955c\u9762\u6e32\u67d3\u3002\u4ece Asset Store \u4e0b\u8f7d\u5bfc\u5165&nbsp;Vive Stereo Rendering Toolket\uff0c\u4fee\u6539\u4e24\u5904\u4ee3\u7801\uff0c\u4f7f\u5176\u517c\u5bb9 Unity 2019.2.x\u3002<\/p>\n\n\n\n<p>DeviceType.cs<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u884c\u6570 43 ~ 68\n\/\/ \u6ce8\u91ca\u6389\u4ee5\u4e0b\u90e8\u5206\n\n        public static IDeviceParamFactory InitParamFactory(HmdType hmdType)\n        {\n\/\/ #if (VIVE_STEREO_STEAMVR)\n\/\/             if (hmdType == HmdType.SteamVR)\n\/\/             {\n                return new SteamVRParamFactory();\n\/\/             }\n\/\/ #endif\n\n\/\/ #if (VIVE_STEREO_OVR)\n\/\/             if (hmdType == HmdType.OVR)\n\/\/             {\n\/\/                 return new OVRParamFactory();\n\/\/             }\n\/\/ #endif\n\n\/\/ #if (UNITY_ANDROID &amp;&amp; VIVE_STEREO_WAVEVR)\n\/\/             if (hmdType == HmdType.WaveVR)\n\/\/             {\n\/\/                 return new WaveVRParamFactory();\n\/\/             }\n\/\/ #endif\n\n\/\/             Debug.LogError(\"Cannot get suitable projection parameter for current HMD.\");\n\/\/             return null;\n        }<\/code><\/pre>\n\n\n\n<p>SteamVRParamFactory.cs<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/========= Copyright 2016-2017, HTC Corporation. All rights reserved. ===========\nusing UnityEngine;\nusing Valve.VR; \/\/ \u5728\u5f00\u5934\u6dfb\u52a0 using Valve.VR.\n\n\/\/ \u6ce8\u91ca\u6389\u4ee5\u4e0b\u90e8\u5206\n\nnamespace HTC.UnityPlugin.StereoRendering\n{\n\/\/ #if (VIVE_STEREO_STEAMVR)\n    public class SteamVRParamFactory : IDeviceParamFactory\n    {\n        public int GetRenderWidth()\n        {\n            return (int)SteamVR.instance.sceneWidth;\n        }\n\n        public int GetRenderHeight()\n        {\n            return (int)SteamVR.instance.sceneHeight;\n        }\n\n        public Vector3 GetEyeSeperation(int eye)\n        {\n            var eyePos = SteamVR.instance.eyes&#91;eye].pos;\n            eyePos.z = 0.0f;\n            return eyePos;\n        }\n\n        public Quaternion GetEyeLocalRotation(int eye)\n        {\n            return SteamVR.instance.eyes&#91;eye].rot;\n        }\n\n        public Matrix4x4 GetProjectionMatrix(int eye, float nearPlane, float farPlane)\n        {\n            return HMDMatrix4x4ToMatrix4x4(SteamVR.instance.hmd.GetProjectionMatrix((Valve.VR.EVREye)eye, nearPlane, farPlane));\n        }\n\n        \/\/ transform a SteamVR matrix format to Unity matrix format\n        private Matrix4x4 HMDMatrix4x4ToMatrix4x4(Valve.VR.HmdMatrix44_t hmdMatrix)\n        {\n            Matrix4x4 m = Matrix4x4.identity;\n\n            m&#91;0, 0] = hmdMatrix.m0;\n            m&#91;0, 1] = hmdMatrix.m1;\n            m&#91;0, 2] = hmdMatrix.m2;\n            m&#91;0, 3] = hmdMatrix.m3;\n\n            m&#91;1, 0] = hmdMatrix.m4;\n            m&#91;1, 1] = hmdMatrix.m5;\n            m&#91;1, 2] = hmdMatrix.m6;\n            m&#91;1, 3] = hmdMatrix.m7;\n\n            m&#91;2, 0] = hmdMatrix.m8;\n            m&#91;2, 1] = hmdMatrix.m9;\n            m&#91;2, 2] = hmdMatrix.m10;\n            m&#91;2, 3] = hmdMatrix.m11;\n\n            m&#91;3, 0] = hmdMatrix.m12;\n            m&#91;3, 1] = hmdMatrix.m13;\n            m&#91;3, 2] = hmdMatrix.m14;\n            m&#91;3, 3] = hmdMatrix.m15;\n\n            return m;\n        }\n    }\n\/\/ #endif\n}<\/code><\/pre>\n\n\n\n<p>\u65b0\u5efa3D\u7269\u4f53\u2192 Quad \u4f5c\u4e3a\u955c\u5b50\u6a21\u578b\uff0c\u6dfb\u52a0 Stereo Renderer \u7ec4\u4ef6\u3002\u542f\u7528 Is Mirror\uff0c\u518d\u628a Canvas Origin World Rot \u548c&nbsp;Anchor World Rot&nbsp;\u8bbe\u4e3a270\u5c31\u884c\u4e86\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\u53c2\u8003\uff1a<\/p>\n\n\n\n<p>\u4e09\u65e5\u6708 \u3075\u3086\u306e. (2019, December 2). Unity 2019.2.x \u3067 VR \u7a7a\u9593\u5185\u306b\u93e1\u3092\u7f6e\u304d\u305f\u3044. Retrieved April 1, 2020, from&nbsp;<a href=\"https:\/\/mikazuki.hatenablog.jp\/entry\/2019\/12\/02\/005945\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/mikazuki.hatenablog.jp\/entry\/2019\/12\/02\/005945<\/a><br><br>&nbsp;&nbsp;&nbsp;&nbsp;Sesleria. (2019, July 13). Vive Stereo Rendering Toolkit(MirrorExample)\u3092Unity2019 SteamVR Plugin2.3.2\u3067\u52d5\u304b\u3059\u307e\u3067. Retrieved April 1, 2020, from&nbsp;<a href=\"https:\/\/qiita.com\/Sesleria\/items\/350092968d6e9b893053\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/qiita.com\/Sesleria\/items\/350092968d6e9b893053<\/a><\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;Ytomi. (2019, October 13). \u3010Unity\u3011\u30e2\u30fc\u30b7\u30e7\u30f3\u30ad\u30e3\u30d7\u30c1\u30e3\u30fc\u3092\u4f7f\u3063\u305f\u30aa\u30ea\u30b8\u30ca\u30eb\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u4f5c\u6210. Retrieved April 1, 2020, from&nbsp;<a href=\"https:\/\/styly.cc\/ja\/tips\/motioncapture-animation_ytomi\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/styly.cc\/ja\/tips\/motioncapture-animation_ytomi\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The following two methods are tested under environment: Unity 2019.2.14 + SteamVR SDK, Built-in RP. \u65b9\u6848 A. Render Texture \u7b80\u5355\u7c97\u66b4\u4f20\u7edf\u827a\u80fd\u3002\u53ea\u8981\u5728\u65b9\u5757\u4e2d\u95f4\u653e\u4e2a\u671d\u524d\u7684\u76f8\u673a\uff0c\u8ba9\u65b9\u5757\u663e\u793a\u76f8\u673a\u62cd\u5230\u7684\u753b\u9762\uff0c\u5c31\u80fd\u8fbe\u5230\u955c\u5b50\u7684\u6548\u679c\u4e86\u3002 \u8fd9\u6837\u5c31\u80fd\u5728\u6a21\u578b\u4e0a\u663e\u793a\u300cMirrorCamera\u300d\u6355\u6349\u5230\u7684\u753b\u9762\u4e86\u3002 \u65b9\u6848 B. Vive Stereo Rendering Toolket \u4f7f\u7528 Vive Stereo Rendering Toolket \u63d0\u4f9b\u7684\u955c\u9762\u6e32\u67d3\u3002\u4ece Asset Store \u4e0b\u8f7d\u5bfc\u5165&nbsp;Vive Stereo Rendering Toolket\uff0c\u4fee\u6539\u4e24\u5904\u4ee3\u7801\uff0c\u4f7f\u5176\u517c\u5bb9 Unity 2019.2.x\u3002 DeviceType.cs SteamVRParamFactory.cs \u65b0\u5efa3D\u7269\u4f53\u2192 Quad \u4f5c\u4e3a\u955c\u5b50\u6a21\u578b\uff0c\u6dfb\u52a0 Stereo Renderer \u7ec4\u4ef6\u3002\u542f\u7528 Is Mirror\uff0c\u518d\u628a Canvas Origin World Rot [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[47,56],"tags":[63,77],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/posts\/26"}],"collection":[{"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/comments?post=26"}],"version-history":[{"count":1,"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/posts\/26\/revisions"}],"predecessor-version":[{"id":27,"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/posts\/26\/revisions\/27"}],"wp:attachment":[{"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/media?parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/categories?post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/noirccc.net\/blog\/wp-json\/wp\/v2\/tags?post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}