{"id":903,"date":"2023-06-25T11:38:51","date_gmt":"2023-06-25T02:38:51","guid":{"rendered":"https:\/\/daba-no-heya.com\/?p=903"},"modified":"2023-06-25T11:38:52","modified_gmt":"2023-06-25T02:38:52","slug":"post-903","status":"publish","type":"post","link":"https:\/\/daba-no-heya.com\/?p=903","title":{"rendered":"\u9802\u70b9\u30b7\u30a7\u30fc\u30c0\u30fc\u3067\u767b\u5834\u3059\u308b\u5ea7\u6a19\u5909\u63db"},"content":{"rendered":"\n<p>\u7ba1\u7406\u4eba\u306f\u73fe\u5728\u3001<a href=\"https:\/\/github.com\/maeda6uiui\/Mechtatel\" target=\"_blank\" rel=\"noreferrer noopener\">Mechtatel<\/a>\u3068\u3044\u3046\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u3092\u958b\u767a\u3057\u3066\u3044\u307e\u3059\u3002<br>(\u307e\u3060\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u3068\u547c\u3079\u308b\u3088\u3046\u306a\u30af\u30aa\u30ea\u30c6\u30a3\u3067\u306f\u306a\u3044\u3067\u3059\u304c\u2026)<\/p>\n\n\n\n<p>\u3053\u306e\u8a18\u4e8b\u3067\u89e3\u8aac\u3059\u308b\u306e\u306f\u9802\u70b9\u30b7\u30a7\u30fc\u30c0(vertex shader)\u3067\u884c\u3063\u3066\u3044\u308b\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u51e6\u7406\u306b\u3064\u3044\u3066\u3067\u3059\u3002<br>(\u305f\u3068\u3048\u3070\u3001Mechtatel\u306e\u6a19\u6e96\u30b7\u30a7\u30fc\u30c0\u30fc\u3067\u3042\u308b<a href=\"https:\/\/github.com\/maeda6uiui\/Mechtatel\/blob\/develop\/Mechtatel\/Standard\/Shader\/GBuffer\/albedo.vert\" target=\"_blank\" rel=\"noreferrer noopener\">albedo.vert<\/a>\u3092\u53c2\u7167\u306e\u3053\u3068)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gl_Position=camera.proj*camera.view*pc.model*vec4(inPosition,1.0);<\/code><\/pre>\n\n\n\n<p>Mechtatel\u306f\u73fe\u5728\u306e\u3068\u3053\u308dVulkan\u3092\u5229\u7528\u3057\u3066\u3044\u307e\u3059\u304c\u3001OpenGL\u3084DirectX\u3067\u3042\u3063\u3066\u3082\u3001\u30b7\u30a7\u30fc\u30c0\u3082\u3057\u304f\u306f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5074\u3067\u540c\u3058\u3088\u3046\u306a\u51e6\u7406\u3092\u884c\u3046\u3053\u3068\u306b\u306a\u308b\u306e\u3067\u306f\u306a\u3044\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u7c21\u5358\u306e\u305f\u3081\u3001\u4e0a\u306e\u30b3\u30fc\u30c9\u306e\u51e6\u7406\u3092\u6570\u5f0f\u3067\u8868\u73fe\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>$$\n\\boldsymbol{p}_{\\rm{clip}}=M_{\\rm{proj}}M_{\\rm{view}}M_{\\rm{model}}\\boldsymbol{p}_{\\rm{local}}\n$$<\/p>\n\n\n\n<p>\u3053\u306e\u5f0f\u306f\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19$\\boldsymbol{p}_{\\rm{local}}$\u3092\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19$\\boldsymbol{p}_{\\rm{clip}}$\u306b\u5909\u63db\u3059\u308b\u51e6\u7406\u3092\u8868\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001\u305d\u308c\u305e\u308c\u306e\u5ea7\u6a19\u3068\u5909\u63db\u884c\u5217\u306b\u3064\u3044\u3066\u4e00\u3064\u305a\u3064\u8aac\u660e\u3057\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%BA%A7%E6%A8%99\" >\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\" >\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E3%83%93%E3%83%A5%E3%83%BC%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\" >\u30d3\u30e5\u30fc\u7a7a\u9593\u5ea7\u6a19<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\" >\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E5%B9%B3%E8%A1%8C%E5%B0%84%E5%BD%B1\" >\u5e73\u884c\u5c04\u5f71<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E9%80%8F%E8%A6%96%E5%B0%84%E5%BD%B1\" >\u900f\u8996\u5c04\u5f71<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E9%80%8F%E8%A6%96%E5%B0%84%E5%BD%B1%E3%82%92%E8%A1%8C%E3%81%86%E5%A0%B4%E5%90%88%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9\" >\u900f\u8996\u5c04\u5f71\u3092\u884c\u3046\u5834\u5408\u306e\u6ce8\u610f\u70b9<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#Vulkan%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%B0%84%E5%BD%B1%E8%A1%8C%E5%88%97\" >Vulkan\u306b\u304a\u3051\u308b\u5c04\u5f71\u884c\u5217<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E5%BA%A7%E6%A8%99\" >\u6b63\u898f\u5316\u30c7\u30d0\u30a4\u30b9\u5ea7\u6a19<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\" >\u30b9\u30af\u30ea\u30fc\u30f3\u7a7a\u9593\u5ea7\u6a19<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/daba-no-heya.com\/?p=903\/#%E3%81%BE%E3%81%A8%E3%82%81\" >\u307e\u3068\u3081<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%BA%A7%E6%A8%99\"><\/span>\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><strong>\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19<\/strong>(local coordinates)\u306f\u3001\u305d\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u6240\u5c5e\u3059\u308b\u30ed\u30fc\u30ab\u30eb\u7a7a\u9593\u306b\u304a\u3051\u308b\u5ea7\u6a19\u3067\u3059\u3002<br>\u5c11\u3057\u8a9e\u5f0a\u304c\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u3001\u305f\u3068\u3048\u3070\u3042\u308b\u90e8\u5c4b\u306b\u8907\u6570\u306e\u4eba\u304c\u3044\u3066\u3001\u305d\u308c\u305e\u308c\u306e\u4eba\u304c\u81ea\u5206\u81ea\u8eab\u3092\u4e2d\u5fc3\u3068\u3059\u308b\u5ea7\u6a19\u7cfb\u3092\u3082\u3063\u3066\u3044\u308b\u3068\u304d\u3001\u305d\u308c\u304c\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u3067\u3059\u3002<br>A\u3055\u3093\u306b\u306fA\u3055\u3093\u3092\u4e2d\u5fc3\u3068\u3057\u305f\u5ea7\u6a19\u7cfb\u304c\u3042\u308a\u3001B\u3055\u3093\u3082\u540c\u69d8\u3067\u3059\u3002<br>\u90e8\u5c4b\u306e\u4e2d\u306b\u5b58\u5728\u3059\u308b\u305d\u308c\u305e\u308c\u306e\u4eba\u306b\u3064\u3044\u3066\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u304c\u5b58\u5728\u3057\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/local_and_world_coordinates-1024x601.png\" alt=\"\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u3068\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19\" class=\"wp-image-904\" width=\"808\" height=\"474\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/local_and_world_coordinates-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/local_and_world_coordinates-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/local_and_world_coordinates-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/local_and_world_coordinates.png 1282w\" sizes=\"auto, (max-width: 808px) 100vw, 808px\" \/><\/figure>\n<\/div>\n\n\n<p>Mechtatel\u3067\u306f\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u4e2d\u5fc3\u304c\u5e38\u306b\u539f\u70b9\u306b\u5b58\u5728\u3059\u308b\u3088\u3046\u306a\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u7cfb\u3092\u60f3\u5b9a\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u4e2d\u5fc3\u306e\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19$\\boldsymbol{p}_{\\rm{local}}$\u306f<\/p>\n\n\n\n<p>$$\n\\boldsymbol{p}_{\\rm{local}}=\n\\begin{pmatrix}\n    0 \\\\\n    0 \\\\\n    0 \\\\\n    1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3067\u3001\u5e73\u884c\u79fb\u52d5\u3084\u56de\u8ee2\u306b\u3088\u3063\u3066\u5909\u5316\u3057\u307e\u305b\u3093\u3002<br>\u3053\u3053\u3067\u300c\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u4e2d\u5fc3\u300d\u3068\u8a00\u3063\u3066\u3044\u308b\u306e\u306f\u3001\u5404\u9802\u70b9\u306e\u5e73\u5747\u3092\u8a08\u7b97\u3057\u3066\u3044\u308b\u308f\u3051\u3067\u306f\u306a\u304f\u3001\u3042\u304f\u307e\u3067\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u4f5c\u6210\u3055\u308c\u305f\u3068\u304d\u306e\u4e2d\u5fc3\u70b9\u304c\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u306e\u539f\u70b9\u306b\u3042\u308b\u3068\u307f\u306a\u3057\u3066\u3044\u308b\u3001\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002<br>\u8a73\u3057\u304f\u306f\u308f\u304b\u308a\u307e\u305b\u3093\u304c\u3001\u3053\u3053\u306e\u5b9f\u88c5\u306f\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u306b\u3088\u3063\u3066\u7570\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>\u3068\u3053\u308d\u3067\u30013\u6b21\u5143\u306e\u5ea7\u6a19\u306b\u6b21\u5143\u3092\u4e00\u3064\u8ffd\u52a0\u3057\u305f<\/p>\n\n\n\n<p>$$\n\\boldsymbol{p}=\n\\begin{pmatrix}\n    x \\\\\n    y \\\\\n    z \\\\\n    w\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3068\u3044\u3046\u5f62\u5f0f\u306e\u5ea7\u6a19\u3092<strong>\u540c\u6b21\u5ea7\u6a19<\/strong>(homogeneous coordinates)\u3068\u547c\u3073\u307e\u3059\u3002<br>\u540c\u6b21\u5ea7\u6a19\u3092\u7528\u3044\u308b\u3068\u5e73\u884c\u79fb\u52d5\u3084\u56de\u8ee2\u3092\u884c\u5217\u3067\u8868\u73fe\u3059\u308b\u306e\u306b\u4fbf\u5229\u306a\u305f\u3081\u3001\u3053\u306e\u5f62\u5f0f\u3092\u7528\u3044\u308b\u306e\u304c\u4e00\u822c\u7684\u3067\u3059\u3002<br>$w=1$\u306e\u3068\u304d\u306f\u4f4d\u7f6e\u3092\u8868\u3057\u3001$w=0$\u306e\u3068\u304d\u306f\u65b9\u5411\u3092\u8868\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\"><\/span>\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><strong>\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19<\/strong>(world-space coordinates)\u306f\u305d\u306e\u4e16\u754c\u5168\u4f53\u3067\u306e\u5ea7\u6a19\u3067\u3059\u3002<br>\u305f\u3068\u3048\u3070\u90e8\u5c4b\u306e\u4e2d\u5fc3\u3092\u539f\u70b9\u3068\u3059\u308b\u5ea7\u6a19\u7cfb\u3067\u3001\u305d\u308c\u305e\u308c\u306e\u4eba\u304c\u90e8\u5c4b\u306e\u3069\u3053\u306b\u3044\u308b\u306e\u304b(\u5404\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u7cfb\u306e\u4f4d\u7f6e)\u3092\u8868\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br>\u81ea\u5206\u4e2d\u5fc3\u3060\u3063\u305f\u5ea7\u6a19\u7cfb\u3092\u3001\u90e8\u5c4b\u3092\u4e2d\u5fc3\u3068\u3057\u305f\u5ea7\u6a19\u7cfb\u306b\u5909\u63db\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19\u3092$\\boldsymbol{p}_{\\rm{world}}$\u3068\u3059\u308b\u3068\u3001$\\boldsymbol{p}_{\\rm{world}}=M_{\\rm{model}}\\boldsymbol{p}_{\\rm{local}}$\u3067\u8868\u305b\u307e\u3059\u3002 $M_{\\rm{model}}$\u304c<strong>\u30e2\u30c7\u30eb\u884c\u5217<\/strong>(model matrix)\u3068\u547c\u3070\u308c\u3001\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u3092\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19\u306b\u5909\u63db\u3059\u308b\u5f79\u5272\u3092\u3082\u3061\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u3068\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19\u304c\u3068\u3082\u306b\u76f4\u4ea4\u5ea7\u6a19\u7cfb\u306a\u3089\u3001\u5e73\u884c\u79fb\u52d5\u3068\u62e1\u5927\u30fb\u7e2e\u5c0f\u306f\u4ee5\u4e0b\u306e\u884c\u5217\u3067\u8868\u73fe\u3067\u304d\u307e\u3059\u3002<br>\u7a7a\u767d\u306b\u306a\u3063\u3066\u3044\u308b\u6210\u5206\u306f0\u3067\u3059\u3002<\/p>\n\n\n\n<p>$$\n\\begin{gather*}\n    M_{\\rm{translate}}=\n    \\begin{pmatrix}\n        1 &amp; &amp; &amp; x \\\\\n        &amp; 1 &amp; &amp; y \\\\\n        &amp; &amp; 1 &amp; z \\\\\n        &amp; &amp; &amp; 1\n    \\end{pmatrix} \\\\\n    M_{\\rm{scaling}}=\n    \\begin{pmatrix}\n        x &amp; &amp; &amp; \\\\\n        &amp; y &amp; &amp; \\\\\n        &amp; &amp; z &amp; \\\\\n        &amp; &amp; &amp; 1\n    \\end{pmatrix}\n\\end{gather*}\n$$<\/p>\n\n\n\n<p>\u56de\u8ee2\u306f\u5c11\u3057\u8907\u96d1\u306b\u306a\u308a\u307e\u3059\u304c\u3001\u305f\u3068\u3048\u3070$x$\u8ef8\u56de\u308a\u306b\u89d2\u5ea6$\\theta$\u3060\u3051\u56de\u8ee2\u3059\u308b\u884c\u5217\u306f\u3001<\/p>\n\n\n\n<p>$$\nM_{\\rm{rotx}}=\n\\begin{pmatrix}\n    1 &amp; &amp; &amp; \\\\\n    &amp; \\cos\\theta &amp; -\\sin\\theta &amp; \\\\\n    &amp; \\sin\\theta &amp; \\cos\\theta &amp; \\\\\n    &amp; &amp; &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3053\u308c\u3089\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u304b\u3089\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u5ea7\u6a19\u3078\u306e\u5909\u63db\u3092\u884c\u3046\u30e2\u30c7\u30eb\u884c\u5217\u3092\u4f5c\u308a\u307e\u3059\u3002<br>\u305f\u3068\u3048\u3070\u3001$(x,y,z)=(1,2,3)$\u5e73\u884c\u79fb\u52d5\u3057\u3066\u304b\u3089$x$\u8ef8\u56de\u308a\u306b$\\frac{\\pi}{2}$\u56de\u8ee2\u3059\u308b\u5834\u5408\u306f\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    M_{\\rm{model}}&amp;=M_{\\rm{rotx}}M_{\\rm{translate}} \\\\\n    &amp;=\n    \\begin{pmatrix}\n        1 &amp; &amp; &amp; \\\\\n        &amp; \\cos\\frac{\\pi}{2} &amp; -\\sin\\frac{\\pi}{2} &amp; \\\\\n        &amp; \\sin\\frac{\\pi}{2} &amp; \\cos\\frac{\\pi}{2} &amp; \\\\\n        &amp; &amp; &amp; 1\n    \\end{pmatrix}\n    \\begin{pmatrix}\n        1 &amp; &amp; &amp; 1 \\\\\n        &amp; 1 &amp; &amp; 2 \\\\\n        &amp; &amp; 1 &amp; 3 \\\\\n        &amp; &amp; &amp; 1\n    \\end{pmatrix}\n\\end{align*}\n$$<\/p>\n\n\n\n<p>\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u304c\u76f4\u4ea4\u5ea7\u6a19\u7cfb\u3067\u306a\u3044\u5834\u5408(\u6975\u5ea7\u6a19\u306a\u3069)\u306f\u3001\u30e2\u30c7\u30eb\u884c\u5217\u3067\u76f4\u4ea4\u5ea7\u6a19\u7cfb\u306b\u5909\u63db\u3057\u307e\u3059\u3002<br>(\u30ef\u30fc\u30eb\u30c9\u5ea7\u6a19\u4ee5\u964d\u306e\u5ea7\u6a19\u7cfb\u306f\u76f4\u4ea4\u5ea7\u6a19\u7cfb\u3092\u7528\u3044\u308b\u306e\u304c\u4e00\u822c\u7684\u304b\u3068\u601d\u3044\u307e\u3059)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%83%93%E3%83%A5%E3%83%BC%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\"><\/span>\u30d3\u30e5\u30fc\u7a7a\u9593\u5ea7\u6a19<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>The engine don&#8217;t move the ship at all.<br>The ship stays where it is and the engines move the universe around it.<br>(\u30a8\u30f3\u30b8\u30f3\u306f\u8239\u3092\u5168\u304f\u52d5\u304b\u3055\u306a\u3044\u3002\u8239\u306f\u305d\u306e\u5834\u306b\u3068\u3069\u307e\u308a\u3001\u30a8\u30f3\u30b8\u30f3\u304c\u8239\u306e\u307e\u308f\u308a\u306e\u4e16\u754c\u3092\u52d5\u304b\u3059\u306e\u3060)<br>\u2500Futurama<\/p>\n<\/blockquote>\n\n\n\n<p>\u3053\u3053\u3067\u30ab\u30e1\u30e9\u3068\u3044\u3046\u6982\u5ff5\u304c\u767b\u5834\u3057\u307e\u3059\u3002<br>\u73fe\u5b9f\u4e16\u754c\u3067\u3042\u308c\u3070\u898b\u305f\u3044\u65b9\u5411\u306b\u30ab\u30e1\u30e9\u3092\u52d5\u304b\u3057\u307e\u3059\u304c\u30013D\u30b0\u30e9\u30d5\u30a3\u30c3\u30af\u30b9\u306e\u4e16\u754c\u3067\u306f\u30ab\u30e1\u30e9\u306f\u56fa\u5b9a\u3057\u3066\u3042\u308a\u3001\u4ee3\u308f\u308a\u306b\u305d\u306e\u307e\u308f\u308a\u306e\u4e16\u754c\u3092\u30ab\u30e1\u30e9\u306e\u753b\u89d2\u306b\u53ce\u307e\u308b\u3088\u3046\u306b\u52d5\u304b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001\u30ab\u30e1\u30e9\u306f\u5e38\u306b\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u306e\u539f\u70b9\u306b\u3042\u308a\u3001$y$\u8ef8\u306e\u6b63\u306e\u65b9\u5411\u3092\u4e0a\u3068\u3057\u3066$z$\u8ef8\u306e\u6b63\u306e\u65b9\u5411\u3092\u5411\u3044\u3066\u3044\u308b\u3068\u3057\u307e\u3059\u3002<br>\u3053\u306e\u30ab\u30e1\u30e9\u306e\u753b\u89d2\u306b\u53ce\u307e\u308b\u3088\u3046\u306b\u3001\u90e8\u5c4b\u306e\u4e2d\u306b\u3044\u308b\u4eba\u3092\u5e73\u884c\u79fb\u52d5\u304a\u3088\u3073\u56de\u8ee2\u3055\u305b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306a\u5ea7\u6a19\u5909\u63db\u3092\u884c\u3046\u884c\u5217$M_{\\rm{view}}$\u3092<strong>\u30d3\u30e5\u30fc\u884c\u5217<\/strong>(view matrix)\u3068\u547c\u3073\u3001\u30d3\u30e5\u30fc\u884c\u5217\u306b\u3088\u3063\u3066\u5909\u63db\u3055\u308c\u305f\u5ea7\u6a19\u3092<strong>\u30d3\u30e5\u30fc\u7a7a\u9593\u5ea7\u6a19<\/strong>(view-space coordinates)\u3068\u547c\u3073\u307e\u3059\u3002<br>\u30d3\u30e5\u30fc\u7a7a\u9593\u5ea7\u6a19\u3092$\\boldsymbol{p}_{\\rm{view}}$<em>\u3068\u3059\u308b\u3068\u3001<\/em>$\\boldsymbol{p}_{\\rm{view}}=M_{\\rm{view}}\\boldsymbol{p}_{\\rm{world}}$\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u5909\u63db\u3092\u884c\u3046\u305f\u3081\u306b\u306f\u3001\u4eee\u60f3\u7684\u306a\u30ab\u30e1\u30e9\u306e\u30ef\u30fc\u30eb\u30c9\u7a7a\u9593\u3067\u306e<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f4d\u7f6e$\\boldsymbol{p}_{\\rm{eye}}$<\/li>\n\n\n\n<li>\u8996\u7dda\u306e\u65b9\u5411$\\boldsymbol{v}_{\\rm{target}}$<\/li>\n\n\n\n<li>\u30ab\u30e1\u30e9\u306e\u4e0a\u65b9\u5411$\\boldsymbol{v}_{\\rm{up}}$<\/li>\n<\/ul>\n\n\n\n<p>\u304c\u5fc5\u8981\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30ab\u30e1\u30e9\u306e\u4e0a\u65b9\u5411\u304c\u308f\u304b\u3089\u306a\u3044\u3068\u30ed\u30fc\u30eb($z$\u8ef8\u56de\u308a\u306e\u56de\u8ee2)\u304c\u5b9a\u307e\u3089\u306a\u3044\u306e\u3067\u3001\u4e0a\u65b9\u5411\u306e\u60c5\u5831\u3082\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002<br>\u30ab\u30e1\u30e9\u3092\u6a2a\u306b\u50be\u3051\u308b\u3068\u6620\u50cf\u3082\u50be\u304f\u3053\u3068\u3092\u60f3\u5b9a\u3057\u3066\u3082\u3089\u3048\u308c\u3070\u3044\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates-1024x601.png\" alt=\"\u30d3\u30e5\u30fc\u7a7a\u9593\" class=\"wp-image-905\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u3053\u3053\u3067\u3001$\\boldsymbol{p}_{\\rm{eye}}=(x_e\\space y_e\\space z_e)^{\\rm{T}}$\u3068\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u305a\u306f\u30ab\u30e1\u30e9\u3092\u539f\u70b9\u307e\u3067\u5e73\u884c\u79fb\u52d5\u3057\u307e\u3059\u3002<br>\u5e73\u884c\u79fb\u52d5\u3092\u884c\u3046\u884c\u5217$T$\u306f\u3001<\/p>\n\n\n\n<p>$$\nT=\n\\begin{pmatrix}\n    1 &amp; &amp; &amp; -x_e \\\\\n    &amp; 1 &amp; &amp; -y_e \\\\\n    &amp; &amp; 1 &amp; -z_e \\\\\n    &amp; &amp; &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_2-1024x601.png\" alt=\"\u30d3\u30e5\u30fc\u7a7a\u95932\" class=\"wp-image-906\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_2-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_2-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_2-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_2.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u3053\u3053\u3067\u3001\u30ab\u30e1\u30e9\u3092\u57fa\u6e96\u3068\u3057\u305f\u6b63\u898f\u76f4\u4ea4\u57fa\u5e95\u3092\u6c42\u3081\u307e\u3059\u3002<br>\u8996\u7dda\u306e\u65b9\u5411$\\boldsymbol{v}_{\\rm{target}}$\u304c$z$\u8ef8\u306e\u6b63\u306e\u65b9\u5411\u3068\u3057\u305f\u3044\u306e\u3067\u3001$z$\u8ef8\u65b9\u5411\u306e\u57fa\u5e95\u306f$\\boldsymbol{e}&#8217;_z=-\\boldsymbol{v}_{\\rm{target}}\/|\\boldsymbol{v}_{\\rm{target}}|=(x_z\\space y_z\\space z_z)^{\\rm{T}}$\u3068\u3057\u307e\u3059\u3002<br>\u8996\u7dda\u306e\u9006\u30d9\u30af\u30c8\u30eb\u3092\u57fa\u5e95\u3068\u3057\u3066\u3044\u308b\u306e\u306f\u3001\u5ea7\u6a19\u7cfb\u3092\u53f3\u624b\u7cfb\u306b\u3057\u3066\u304a\u304d\u305f\u3044\u304b\u3089\u3067\u3059\u3002<br>\u3053\u306e\u307e\u307e\u3060\u3068\u8996\u7dda\u306e\u9006\u65b9\u5411\u3092\u57fa\u6e96\u306b\u3057\u305f\u5ea7\u6a19\u7cfb\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\u304c\u3001\u3053\u306e\u5f8c\u306e\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3092\u6c42\u3081\u308b\u3068\u304d\u306b$z$\u8ef8\u3092\u53cd\u8ee2\u3059\u308b\u3053\u3068\u3067\u4fee\u6b63\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3055\u3089\u306b\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    \\boldsymbol{e}&#8217;_x&amp;=\\frac{\\boldsymbol{v}_{\\rm{up}}\\times \\boldsymbol{e}&#8217;_z}{|\\boldsymbol{v}_{\\rm{up}}\\times \\boldsymbol{e}&#8217;_z|}=(x_x\\space y_x\\space z_x)^{\\rm{T}} \\\\\n    \\boldsymbol{e}&#8217;_y&amp;=\\boldsymbol{e}&#8217;_z\\times\\boldsymbol{e}&#8217;_x=(x_y\\space y_y\\space z_y)^{\\rm{T}}\n\\end{align*}\n$$<\/p>\n\n\n\n<p>\u3068\u3059\u308c\u3070\u3001\u4e09\u3064\u306e\u57fa\u5e95\u304c\u305d\u308d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>$\\boldsymbol{v}_{\\rm{up}}=(x_u\\space y_u\\space z_u)^{\\rm{T}}$\u3068\u3057\u3066$\\boldsymbol{e}&#8217;_x$\u306e\u5177\u4f53\u7684\u306a\u6210\u5206\u3092\u8a08\u7b97\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_x&amp;=y_uz_z-z_uy_z \\\\\n        y_x&amp;=z_ux_z-x_uz_z \\\\\n        z_x&amp;=x_uy_z-y_ux_z\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>$\\boldsymbol{e}&#8217;_y$\u3092\u8a08\u7b97\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_y&amp;=y_z(x_uy_z-y_ux_z)-z_z(z_ux_z-x_uz_z) \\\\\n        y_y&amp;=z_z(y_uz_z-z_uy_z)-x_z(x_uy_z-y_ux_z) \\\\\n        z_y&amp;=x_z(z_ux_z-x_uz_z)-y_z(y_uz_z-z_uy_z)\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u3053\u3067\u306e\u76ee\u6a19\u306f\u3001<\/p>\n\n\n\n<p>$$\n\\begin{gather*}\n    \\boldsymbol{e}&#8217;_x \\to \\boldsymbol{e}_x=(1\\space 0\\space 0)^{\\rm{T}} \\\\\n    \\boldsymbol{e}&#8217;_y \\to \\boldsymbol{e}_y=(0\\space 1\\space 0)^{\\rm{T}} \\\\\n    \\boldsymbol{e}&#8217;_z \\to \\boldsymbol{e}_z=(0\\space 0\\space 1)^{\\rm{T}} \\\\\n\\end{gather*}\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308b\u3088\u3046\u306a\u5909\u63db\u3092\u6c42\u3081\u308b\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u5909\u63db\u3092\u884c\u3046\u884c\u5217\u3092$R$\u3068\u304a\u304f\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        &amp;\\boldsymbol{e}_x=R\\boldsymbol{e}&#8217;_x \\\\\n        &amp;\\boldsymbol{e}_y=R\\boldsymbol{e}&#8217;_y \\\\\n        &amp;\\boldsymbol{e}_z=R\\boldsymbol{e}&#8217;_z\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3092\u6e80\u305f\u3059$R$\u3092\u6c42\u3081\u308c\u3070\u3044\u3044\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e$R$\u3092\u76f4\u63a5\u6c42\u3081\u3088\u3046\u3068\u3057\u307e\u3057\u305f\u304c\u3069\u3046\u3082\u8a08\u7b97\u304c\u3046\u307e\u304f\u3044\u304b\u306a\u3044\u306e\u3067\u3001\u307e\u305a\u306f$\\boldsymbol{e}&#8217;_x=P\\boldsymbol{e}_x$\u3092\u6e80\u305f\u3059\u3088\u3046\u306a$P$\u3092\u6c42\u3081\u3066\u3001\u305d\u308c\u304b\u3089$R=P^{-1}$\u306e\u95a2\u4fc2\u3092\u7528\u3044\u3066$R$\u3092\u6c42\u3081\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>$P$\u306e\u5404\u8981\u7d20\u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8868\u73fe\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>$$\nP=\n\\begin{pmatrix}\n    m_{00} &amp; m_{01} &amp; m_{02} &amp; m_{03} \\\\\n    m_{10} &amp; m_{11} &amp; m_{12} &amp; m_{13} \\\\\n    m_{20} &amp; m_{21} &amp; m_{22} &amp; m_{23} \\\\\n    m_{30} &amp; m_{31} &amp; m_{32} &amp; m_{33} \\\\\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>$\\boldsymbol{e}&#8217;_x=P\\boldsymbol{e}_x$\u3088\u308a\u3001<\/p>\n\n\n\n<p>$$\n\\begin{pmatrix}\n    x_x \\\\\n    y_x \\\\\n    z_x \\\\\n    0\n\\end{pmatrix}\n=\n\\begin{pmatrix}\n    m_{00} &amp; &amp; &amp; \\\\\n    &amp; \\ddots &amp; &amp; \\\\\n    &amp; &amp; \\ddots &amp; \\\\\n    &amp; &amp; &amp; m_{33}\n\\end{pmatrix}\n\\begin{pmatrix}\n    1 \\\\\n    0 \\\\\n    0 \\\\\n    0\n\\end{pmatrix}\n=\n\\begin{pmatrix}\n   m_{00} \\\\\n   m_{10} \\\\\n   m_{20} \\\\\n   m_{30}   \n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u306a\u306e\u3067\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        &amp;m_{00}=x_x \\\\\n        &amp;m_{10}=y_x \\\\\n        &amp;m_{20}=z_x \\\\\n        &amp;m_{30}=0\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>$\\boldsymbol{e}&#8217;_y=P\\boldsymbol{e}_y$\u3068$\\boldsymbol{e}&#8217;_z=P\\boldsymbol{e}_z$\u306b\u3064\u3044\u3066\u3082\u540c\u69d8\u306e\u8a08\u7b97\u3067\u3001\u305d\u308c\u305e\u308c<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        &amp;m_{01}=x_y\\\\\n        &amp;m_{11}=y_y \\\\\n        &amp;m_{21}=z_y \\\\\n        &amp;m_{31}=0\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        &amp;m_{02}=x_z \\\\\n        &amp;m_{12}=y_z \\\\\n        &amp;m_{22}=z_z \\\\\n        &amp;m_{32}=0\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3068\u3044\u3046\u95a2\u4fc2\u5f0f\u304c\u5f97\u3089\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6b63\u898f\u76f4\u4ea4\u57fa\u5e95\u3069\u3046\u3057\u306e\u5909\u63db\u306f\u56de\u8ee2\u306a\u306e\u3067\u3001\u5e73\u884c\u79fb\u52d5\u3092\u8868\u3059\u6210\u5206\u3067\u3042\u308b$m_{03}=m_{13}=m_{23}=0$\u3068\u306a\u308a\u307e\u3059\u3002<br>\u307e\u305f\u3001\u4f4d\u7f6e\u3092\u8868\u3059\u540c\u6b21\u5ea7\u6a19($w=1$)\u3092\u5909\u63db\u3057\u305f\u5f8c\u306b\u3082$w=1$\u306b\u306a\u3063\u3066\u3044\u3066\u307b\u3057\u3044\u306e\u3067\u3001$m_{33}=1$\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3057\u305f\u304c\u3063\u3066\u3001<\/p>\n\n\n\n<p>$$\nP=\n\\begin{pmatrix}\n    x_x &amp; x_y &amp; x_z &amp; 0 \\\\\n    y_x &amp; y_y &amp; y_z &amp; 0 \\\\\n    z_x &amp; z_y &amp; z_z &amp; 0 \\\\\n    0 &amp; 0 &amp; 0 &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6b21\u306b\u3001$P$\u306e\u9006\u884c\u5217\u3092\u6c42\u3081\u307e\u3059\u3002<br>\u4f59\u56e0\u5b50\u884c\u5217\u3092\u7528\u3044\u308b\u65b9\u6cd5\u3067\u9006\u884c\u5217\u3092\u6c42\u3081\u3066\u307f\u307e\u3059\u3002<br>(\u8a08\u7b97\u304c\u8907\u96d1\u3067\u3059\u304c\u2026)<\/p>\n\n\n\n<p>\u307e\u305a\u3001$P$\u306e\u884c\u5217\u5f0f$|P|$\u3092\u6c42\u3081\u307e\u3059\u3002<br>\u5217\u306e\u4f59\u56e0\u5b50\u5c55\u958b\u3092\u7528\u3044\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    |P|&amp;=m_{00}\n    \\begin{vmatrix}\n        m_{11} &amp; m_{12} &amp; m_{13} \\\\\n        m_{21} &amp; m_{22} &amp; m_{23} \\\\\n        m_{31} &amp; m_{32} &amp; m_{33}\n    \\end{vmatrix}\n    -m_{10}\n    \\begin{vmatrix}\n        m_{01} &amp; m_{02} &amp; m_{03} \\\\\n        m_{21} &amp; m_{22} &amp; m_{23} \\\\\n        m_{31} &amp; m_{32} &amp; m_{33}\n    \\end{vmatrix} \\\\\n    &amp;\\qquad+m_{20}\n    \\begin{vmatrix}\n        m_{01} &amp; m_{02} &amp; m_{03} \\\\\n        m_{11} &amp; m_{12} &amp; m_{13} \\\\\n        m_{31} &amp; m_{32} &amp; m_{33}\n    \\end{vmatrix}\n    -m_{30}\n    \\begin{vmatrix}\n        m_{01} &amp; m_{02} &amp; m_{03} \\\\\n        m_{11} &amp; m_{12} &amp; m_{13} \\\\\n        m_{21} &amp; m_{22} &amp; m_{23}\n    \\end{vmatrix} \\\\\n    &amp;=x_x(y_yz_z-y_zz_y)-y_x(x_yz_z-x_zz_y)+z_x(x_yy_z-x_zy_y) \\\\\n    &amp;=x_y(y_zz_x-y_xz_z)+y_y(x_xz_z-x_zz_x)+z_y(x_zy_x-x_xy_z) \\\\\n    &amp;=x_y\\{y_z(x_uy_z-y_ux_z)-(z_ux_z-x_uz_z)z_z\\} \\\\\n    &amp;\\qquad+y_y\\{(y_uz_z-z_uy_z)z_z-x_z(x_uy_z-y_ux_z)\\} \\\\\n    &amp;\\qquad+z_y\\{x_z(z_ux_z-x_uz_z)-(y_uz_z-z_uy_z)y_z\\} \\\\\n    &amp;=x_y^2+y_y^2+z_y^2\n\\end{align*}\n$$<\/p>\n\n\n\n<p>\u3053\u3053\u3067\u3001$|\\boldsymbol{e}&#8217;_y|=\\sqrt{x_y^2+y_y^2+z_y^2}=1$\u306a\u306e\u3067\u3001\u7d50\u679c\u3068\u3057\u3066\u306f\u3001<\/p>\n\n\n\n<p>$$\n|P|=1\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6b21\u306b\u3001\u884c\u5217$P$\u304b\u3089$i$\u884c\u3068$j$\u5217\u3092\u53d6\u308a\u9664\u3044\u305f\u5c0f\u884c\u5217\u3092$M_{ij}$\u3068\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    &amp;M_{00}=\n    \\begin{pmatrix}\n        y_y &amp; y_z &amp; 0 \\\\\n        z_y &amp; z_z &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n    \\qquad\n    M_{01}=\n    \\begin{pmatrix}\n        y_x &amp; y_z &amp; 0 \\\\\n        z_x &amp; z_z &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix} \\\\\n    &amp;M_{02}=\n    \\begin{pmatrix}\n        y_x &amp; y_y &amp; 0 \\\\\n        z_x &amp; z_y &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n    \\qquad\n    M_{03}=\n    \\begin{pmatrix}\n        y_x &amp; y_y &amp; y_z \\\\\n        z_x &amp; z_y &amp; z_z \\\\\n        0 &amp; 0 &amp; 0\n    \\end{pmatrix} \\\\\n    &amp;M_{10}=\n    \\begin{pmatrix}\n        x_y &amp; x_z &amp; 0 \\\\\n        z_y &amp; z_z &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n    \\qquad\n    M_{11}=\n    \\begin{pmatrix}\n        x_x &amp; x_z &amp; 0 \\\\\n        z_x &amp; z_z &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix} \\\\\n    &amp;M_{12}=\n    \\begin{pmatrix}\n        x_x &amp; x_y &amp; 0 \\\\\n        z_x &amp; z_y &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n    \\qquad\n    M_{13}=\n    \\begin{pmatrix}\n        x_x &amp; x_y &amp; x_z \\\\\n        z_x &amp; z_y &amp; z_z \\\\\n        0 &amp; 0 &amp; 0\n    \\end{pmatrix} \\\\\n    &amp;M_{20}=\n    \\begin{pmatrix}\n        x_y &amp; x_z &amp; 0 \\\\\n        y_y &amp; y_z &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n    \\qquad\n    M_{21}=\n    \\begin{pmatrix}\n        x_x &amp; x_z &amp; 0 \\\\\n        y_x &amp; y_z &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix} \\\\\n    &amp;M_{22}=\n    \\begin{pmatrix}\n        x_x &amp; x_y &amp; 0 \\\\\n        y_x &amp; y_y &amp; 0 \\\\\n        0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n    \\qquad\n    M_{23}=\n    \\begin{pmatrix}\n        x_x &amp; x_y &amp; x_z \\\\\n        y_x &amp; y_y &amp; y_z \\\\\n        0 &amp; 0 &amp; 0\n    \\end{pmatrix} \\\\\n    &amp;M_{30}=\n    \\begin{pmatrix}\n        x_y &amp; x_z &amp; 0 \\\\\n        y_y &amp; y_z &amp; 0 \\\\\n        z_y &amp; z_z &amp; 0\n    \\end{pmatrix}\n    \\qquad\n    M_{31}=\n    \\begin{pmatrix}\n        x_x &amp; x_z &amp; 0 \\\\\n        y_x &amp; y_z &amp; 0 \\\\\n        z_x &amp; z_z &amp; 0\n    \\end{pmatrix} \\\\\n    &amp;M_{32}=\n    \\begin{pmatrix}\n        x_x &amp; x_y &amp; 0 \\\\\n        y_x &amp; y_y &amp; 0 \\\\\n        z_x &amp; z_y &amp; 0\n    \\end{pmatrix}\n    \\qquad\n    M_{33}=\n    \\begin{pmatrix}\n        x_x &amp; x_y &amp; x_z \\\\\n        y_x &amp; y_y &amp; y_z \\\\\n        z_x &amp; z_y &amp; z_z\n    \\end{pmatrix} \\\\\n\\end{align*}\n$$<\/p>\n\n\n\n<p>$M_{ij}$\u306e\u884c\u5217\u5f0f\u306f\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    |M_{00}|&amp;=y_yz_z-y_zz_y \\\\\n    |M_{01}|&amp;=z_zy_x-y_zz_x \\\\\n    |M_{02}|&amp;=z_yy_x-y_yz_x \\\\\n    |M_{03}|&amp;=0 \\\\\n    |M_{10}|&amp;=x_yz_z-x_zz_y \\\\\n    |M_{11}|&amp;=z_zx_x-x_zz_x \\\\\n    |M_{12}|&amp;=z_yx_x-x_yz_x \\\\\n    |M_{13}|&amp;=0 \\\\\n    |M_{20}|&amp;=x_yy_z-x_zy_y \\\\\n    |M_{21}|&amp;=y_zx_x-x_zy_x \\\\\n    |M_{22}|&amp;=y_yx_x-x_yy_x \\\\\n    |M_{23}|&amp;=0 \\\\\n    |M_{30}|&amp;=0 \\\\\n    |M_{31}|&amp;=0 \\\\\n    |M_{32}|&amp;=0 \\\\\n    |M_{33}|&amp;=x_xy_yz_z+x_yy_zz_x+x_zy_xz_y-x_zy_yz_x-y_zz_yx_x-z_zx_yy_x \\\\\n\\end{align*}\n$$<\/p>\n\n\n\n<p>\u4f59\u56e0\u5b50\u884c\u5217$\\tilde{P}$\u306e\u5404\u6210\u5206\u306f<\/p>\n\n\n\n<p>$$\n\\tilde{P}_{ij}=(-1)^{i+j}|M_{ji}|\n$$<\/p>\n\n\n\n<p>\u306a\u306e\u3067\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    \\tilde{P}_{00}&amp;=|M_{00}|=y_yz_z-y_zz_y \\\\\n    \\tilde{P}_{01}&amp;=-|M_{10}|=x_zz_y-x_yz_z \\\\\n    \\tilde{P}_{02}&amp;=|M_{20}|=x_yy_z-x_zy_y \\\\\n    \\tilde{P}_{03}&amp;=-|M_{30}|=0 \\\\\n    \\tilde{P}_{10}&amp;=-|M_{01}|=y_zz_x-z_zy_x \\\\\n    \\tilde{P}_{11}&amp;=|M_{11}|=x_zx_x-x_zz_x \\\\\n    \\tilde{P}_{12}&amp;=-|M_{21}|=x_zy_x-y_zx_x \\\\\n    \\tilde{P}_{13}&amp;=|M_{31}|=0 \\\\\n    \\tilde{P}_{20}&amp;=|M_{02}|=z_yy_x-y_yz_x \\\\\n    \\tilde{P}_{21}&amp;=-|M_{12}|=x_yz_x-z_yx_x \\\\\n    \\tilde{P}_{22}&amp;=|M_{22}|=y_yx_x-x_yy_x \\\\\n    \\tilde{P}_{23}&amp;=-|M_{32}|=0 \\\\\n    \\tilde{P}_{30}&amp;=|M_{03}|=0 \\\\\n    \\tilde{P}_{31}&amp;=-|M_{13}|=0 \\\\\n    \\tilde{P}_{32}&amp;=|M_{23}|=0 \\\\\n    \\tilde{P}_{33}&amp;=-|M_{33}|=x_zy_yz_x+y_zz_yx_x+z_zx_yy_x-x_xy_yz_z-x_yy_zz_x-x_zy_xz_y \\\\\n\\end{align*}\n$$<\/p>\n\n\n\n<p>$\\tilde{P}_{33}$\u306f\u3082\u3046\u5c11\u3057\u7c21\u5358\u306b\u3067\u304d\u305d\u3046\u3067\u3059\u3002 $\\tilde{P}_{33}=1$\u306b\u306a\u3089\u306a\u3044\u3068\u304a\u304b\u3057\u3044\u3068\u3044\u3046\u3053\u3068\u3092\u5ff5\u982d\u306b\u7f6e\u3044\u3066\u5f0f\u5909\u5f62\u3092\u3057\u3066\u307f\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    &amp;\\quad x_zy_yz_x+y_zz_yx_x+z_zx_yy_x-x_xy_yz_z-x_yy_zz_x-x_zy_xz_y \\\\\n    &amp;=x_y(y_xz_z-y_zz_x)+y_y(x_zz_x-x_xz_z)+z_y(x_xy_z-x_zy_x) \\\\\n    &amp;=x_y^2+y_y^2+z_z^2 \\\\\n    &amp;=1\n\\end{align*}\n$$<\/p>\n\n\n\n<p>\u3057\u305f\u304c\u3063\u3066\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    P^{-1}&amp;=\\frac{1}{|P|}\\tilde{P} \\\\\n    &amp;=\n    \\begin{pmatrix}\n        y_yz_z-y_zz_y &amp; x_zz_y-x_yz_z &amp; x_yy_z-x_zy_y &amp; 0 \\\\\n        y_zz_x-z_zy_x &amp; x_zx_x-x_zz_x &amp; x_zy_x-y_zx_x &amp; 0 \\\\\n        z_yy_x-y_yz_x &amp; x_yz_x-z_yx_x &amp; y_yx_x-x_yy_x &amp; 0 \\\\\n        0 &amp; 0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n\\end{align*}\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u308c\u3067\u6b63\u898f\u76f4\u4ea4\u57fa\u5e95\u306e\u5909\u63db\u3092\u884c\u3046\u884c\u5217$R=P^{-1}$\u304c\u308f\u304b\u308a\u307e\u3057\u305f\u3002<br>\u6700\u7d42\u7684\u306a\u30d3\u30e5\u30fc\u884c\u5217\u306f\u5e73\u884c\u79fb\u52d5\u2192\u56de\u8ee2\u306e\u9806\u756a\u3067\u5ea7\u6a19\u5909\u63db\u3092\u884c\u3048\u3070\u3044\u3044\u306e\u3067\u3001<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    M_{\\rm{view}}&amp;=RT \\\\\n    &amp;=\n    \\begin{pmatrix}\n        y_yz_z-y_zz_y &amp; x_zz_y-x_yz_z &amp; x_yy_z-x_zy_y &amp; 0 \\\\\n        y_zz_x-z_zy_x &amp; x_zx_x-x_zz_x &amp; x_zy_x-y_zx_x &amp; 0 \\\\\n        z_yy_x-y_yz_x &amp; x_yz_x-z_yx_x &amp; y_yx_x-x_yy_x &amp; 0 \\\\\n        0 &amp; 0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n    \\begin{pmatrix}\n        1 &amp; 0 &amp; 0 &amp; -x_e \\\\\n        0 &amp; 1 &amp; 0 &amp; -y_e \\\\\n        0 &amp; 0 &amp; 1 &amp; -z_e \\\\\n        0 &amp; 0 &amp; 0 &amp; 1\n    \\end{pmatrix}\n\\end{align*}\n$$<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_3-1024x601.png\" alt=\"\u30d3\u30e5\u30fc\u7a7a\u95933\" class=\"wp-image-907\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_3-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_3-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_3-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/view_coordinates_3.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\u3053\u3053\u3067\u6c42\u3081\u305f\u30d3\u30e5\u30fc\u884c\u5217\u304c\u6b63\u3057\u3044\u304b\u691c\u7b97\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p>Mechtatel\u3067\u306f<a href=\"https:\/\/github.com\/JOML-CI\/JOML\" target=\"_blank\" rel=\"noreferrer noopener\">JOML<\/a>\u3068\u3044\u3046\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u63a1\u7528\u3057\u3066\u3044\u307e\u3059\u3002<br>JOML\u3067\u306fMatrix4f.lookAt\u3068\u3044\u3046\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3046\u3053\u3068\u3067\u30d3\u30e5\u30fc\u884c\u5217\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002<br>lookAt\u30e1\u30bd\u30c3\u30c9\u3067\u5f97\u3089\u308c\u308b\u30d3\u30e5\u30fc\u884c\u5217\u3068\u624b\u52d5\u3067\u4f5c\u6210\u3057\u305f\u30d3\u30e5\u30fc\u884c\u5217\u304c\u4e00\u81f4\u3059\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-java\"><code class=\"language-java\">public static void main(String[] args) {\n    var cameraEye = new Vector3f(10.0f, 10.0f, 10.0f);\n    var cameraCenter = new Vector3f(0.0f, 0.0f, 0.0f);\n    var cameraUp = new Vector3f(0.0f, 1.0f, 0.0f).normalize();\n    var cameraTarget = new Vector3f(cameraCenter).sub(cameraEye).normalize();\n\n    \/\/\u30d3\u30e5\u30fc\u884c\u5217\u3092\u624b\u52d5\u3067\u4f5c\u6210\u3059\u308b\n    var ez = new Vector3f(cameraTarget).mul(-1.0f);\n    var ex = new Vector3f(cameraUp).cross(ez).normalize();\n    var ey = new Vector3f(ez).cross(ex);\n\n    var rMat = new Matrix4f().identity();\n    rMat.m00(ey.y * ez.z - ez.y * ey.z);\n    rMat.m10(ez.x * ey.z - ey.x * ez.z);\n    rMat.m20(ey.x * ez.y - ez.x * ey.y);\n    rMat.m01(ez.y * ex.z - ez.z * ex.y);\n    rMat.m11(ez.x * ex.x - ez.x * ex.z);\n    rMat.m21(ez.x * ex.y - ez.y * ex.x);\n    rMat.m02(ey.z * ex.y - ey.y * ex.z);\n    rMat.m12(ey.x * ex.z - ey.z * ex.x);\n    rMat.m22(ey.y * ex.x - ey.x * ex.y);\n\n    var tMat = new Matrix4f().identity();\n    tMat.m30(-cameraEye.x);\n    tMat.m31(-cameraEye.y);\n    tMat.m32(-cameraEye.z);\n\n    var viewMat = new Matrix4f(rMat).mul(tMat);\n    System.out.println(\"Manually created view matrix is:\");\n    System.out.println(viewMat);\n\n    \/\/JOML\u306elookAt\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\n    \/\/lookAt\u30e1\u30bd\u30c3\u30c9\u3067\u306f\u30ab\u30e1\u30e9\u306e\u8996\u7dda\u3067\u306f\u306a\u304f\u3001\n    \/\/\u8996\u7dda\u3092\u5411\u3051\u3066\u3044\u308b\u5148\u306e\u4f4d\u7f6e(center)\u3092\u6307\u5b9a\u3059\u308b\n    var viewMat2 = new Matrix4f().lookAt(cameraEye, cameraCenter, cameraUp);\n    System.out.println(\"View matrix by lookAt method is:\");\n    System.out.println(viewMat2);\n}<\/code><\/pre>\n\n\n\n<p>\u51fa\u529b\u7d50\u679c\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u3001\u7d50\u679c\u304c\u4e00\u81f4\u3059\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manually created view matrix is:\n 7.071E-1  0.000E+0 -7.071E-1  0.000E+0\n-4.082E-1  8.165E-1 -4.082E-1  0.000E+0\n 5.774E-1  5.774E-1  5.774E-1 -1.732E+1\n 0.000E+0  0.000E+0  0.000E+0  1.000E+0\n\nView matrix by lookAt method is:\n 7.071E-1  0.000E+0 -7.071E-1 -0.000E+0\n-4.082E-1  8.165E-1 -4.082E-1 -0.000E+0\n 5.774E-1  5.774E-1  5.774E-1 -1.732E+1\n 0.000E+0  0.000E+0  0.000E+0  1.000E+0<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\"><\/span>\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates-1024x601.png\" alt=\"\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\" class=\"wp-image-908\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u30d3\u30e5\u30fc\u884c\u5217\u3092\u7528\u3044\u305f\u5909\u63db\u3067\u3001\u539f\u70b9\u306b\u56fa\u5b9a\u3055\u308c\u305f\u30ab\u30e1\u30e9\u304b\u3089\u898b\u305f\u666f\u8272\u3092\u8868\u3059\u30d3\u30e5\u30fc\u7a7a\u9593\u5ea7\u6a19\u3092\u5f97\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002<br>\u3044\u3088\u3044\u3088<code>gl_Position<\/code>\u306b\u5024\u3092\u30bb\u30c3\u30c8\u3059\u308b\u3001\u3068\u3044\u3046\u3068\u3053\u308d\u3067\u3059\u304c\u3001OpenGL\u3084Vulkan\u3067\u306f<code>gl_Position<\/code>\u306e\u53d6\u308a\u3046\u308b\u5024\u306e\u7bc4\u56f2\u304c\u6c7a\u307e\u3063\u3066\u304a\u308a\u3001\u3053\u306e\u7bc4\u56f2\u304b\u3089\u5916\u308c\u3066\u3044\u308b\u9802\u70b9\u306f\u30af\u30ea\u30c3\u30d7(\u7834\u68c4)\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>gl_Position<\/code>\u306e<code>x<\/code>\u3068<code>y<\/code>\u306b\u3064\u3044\u3066\u306fOpenGL\u3068Vulkan\u5171\u901a\u3067\u3001<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-gl_Position.w &lt;= x,y &lt;= gl_Position.w<\/code><\/pre>\n\n\n\n<p>\u3068\u3044\u3046\u7bc4\u56f2\u306e\u5024\u3092\u53d6\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30ab\u30e1\u30e9\u306f\u539f\u70b9\u306b\u3042\u3063\u3066$z$\u8ef8\u6b63\u306e\u65b9\u5411\u3092\u5411\u3044\u3066\u3044\u308b\u306e\u3067\u3001$z$\u306f\u30ab\u30e1\u30e9\u304b\u3089\u306e\u8ddd\u96e2\u3092\u8868\u3059\u5024\u306b\u306a\u308a\u307e\u3059\u3002<br><code>gl_Position.z<\/code>\u306e\u53d6\u308a\u3046\u308b\u7bc4\u56f2\u306fOpenGL\u3068Vulkan\u3067\u7570\u306a\u3063\u3066\u304a\u308a\u3001OpenGL\u306e\u5834\u5408\u306f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-gl_Position.w &lt;= z &lt;= gl_Position.w<\/code><\/pre>\n\n\n\n<p>\u3068\u306a\u308a<code>x<\/code>\u3084<code>y<\/code>\u3068\u540c\u3058\u7bc4\u56f2\u3067\u3059\u304c\u3001Vulkan\u306e\u5834\u5408\u306f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0 &lt;= z &lt;= gl_Position.w<\/code><\/pre>\n\n\n\n<p>\u3068\u306a\u308a\u3001<code>z<\/code>\u304c\u8ca0\u306e\u5024\u306b\u306a\u3063\u3066\u3044\u308b\u3068\u304d\u306b\u306f\u30af\u30ea\u30c3\u30d7\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0a\u306e\u3088\u3046\u306b\u3001<code>gl_Position<\/code>\u306e\u53d6\u308a\u3046\u308b\u5024\u306e\u7bc4\u56f2\u304c\u6c7a\u307e\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u30d3\u30e5\u30fc\u7a7a\u9593\u5ea7\u6a19\u3092\u5909\u63db\u3057\u3001\u3053\u308c\u3089\u306e\u7bc4\u56f2\u306b\u53ce\u307e\u308b\u5024\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br>\u3053\u306e\u3088\u3046\u306a\u5909\u63db\u3092\u884c\u3046\u884c\u5217\u3092<strong>\u5c04\u5f71\u884c\u5217<\/strong>(projection matrix)\u3068\u3044\u3044\u3001\u5c04\u5f71\u884c\u5217\u306b\u3088\u3063\u3066\u5909\u63db\u3055\u308c\u305f\u5f8c\u306e\u5ea7\u6a19\u3092<strong>\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19<\/strong>(clip-space coordinates)\u3068\u547c\u3073\u307e\u3059\u3002<br>\u3064\u307e\u308a\u3001<code>gl_Position<\/code>\u306b\u306f\u9802\u70b9\u306e\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3092\u30bb\u30c3\u30c8\u3059\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4e00\u822c\u7684\u306a\u5c04\u5f71\u884c\u5217\u3068\u3057\u3066\u306f\u3001<strong>\u5e73\u884c\u5c04\u5f71<\/strong>(orthographic projection)\u3068<strong>\u900f\u8996\u5c04\u5f71<\/strong>(perspective projection)\u306e\u4e8c\u3064\u304c\u3042\u308a\u307e\u3059\u3002<br>\u3053\u306e\u4e8c\u3064\u306b\u3064\u3044\u3066\u3001\u305d\u308c\u305e\u308c\u8aac\u660e\u3057\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%B9%B3%E8%A1%8C%E5%B0%84%E5%BD%B1\"><\/span>\u5e73\u884c\u5c04\u5f71<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>$xy$\u5e73\u9762\u3001$yz$\u5e73\u9762\u3001$xz$\u5e73\u9762\u305d\u308c\u305e\u308c\u306b\u5e73\u884c\u306a\u9762\u3092\u3082\u3064\u76f4\u65b9\u4f53\u3092\u8003\u3048\u307e\u3059\u3002<br>\u3053\u306e\u76f4\u65b9\u4f53\u306e\u4e2d\u306b\u3042\u308b\u9802\u70b9\u304c\u6700\u7d42\u7684\u306b\u63cf\u753b\u3055\u308c\u308b\u3088\u3046\u306b\u3057\u305f\u3044\u3067\u3059\u3002<br>\u3053\u308c\u3092<strong>\u5e73\u884c\u5c04\u5f71<\/strong>(orthographic projection)\u3068\u547c\u3073\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/orthographic_projection-1024x601.jpg\" alt=\"\u5e73\u884c\u5c04\u5f71\" class=\"wp-image-909\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/orthographic_projection-1024x601.jpg 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/orthographic_projection-300x176.jpg 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/orthographic_projection-768x450.jpg 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/orthographic_projection.jpg 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u3053\u3053\u3067\u3001\u30ab\u30e1\u30e9\u306b\u8fd1\u3044\u65b9\u306e\u9762\u307e\u3067\u306e\u8ddd\u96e2\u3092$z_{\\rm{near}}$\u3001\u9060\u3044\u65b9\u306e\u9762\u307e\u3067\u306e\u8ddd\u96e2\u3092$z_{\\rm{far}}$\u3068\u3057\u307e\u3059\u3002<br>\u307e\u305f\u3001\u30ab\u30e1\u30e9\u306e\u6b63\u9762\u306b\u3042\u308b\u9762\u306e$x$\u8ef8\u6b63\u306e\u65b9\u5411\u306e$x$\u5ea7\u6a19\u3092$x_{\\rm{right}}$\u3001\u8ca0\u306e\u65b9\u5411\u306e$x$\u5ea7\u6a19\u3092$x_{\\rm{left}}$\u3068\u3057\u3001\u76f4\u65b9\u4f53\u306e\u4e0a\u5074\u3068\u4e0b\u5074\u306e$y$\u5ea7\u6a19\u3092\u305d\u308c\u305e\u308c$y_{\\rm{top}}$\u3001$y_{\\rm{bottom}}$\u3068\u3057\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_2-1024x601.png\" alt=\"\u30af\u30ea\u30c3\u30d7\u7a7a\u95932\" class=\"wp-image-910\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_2-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_2-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_2-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_2.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u307e\u305a\u3001\u76f4\u65b9\u4f53\u3092\u5e73\u884c\u79fb\u52d5\u3057\u307e\u3059\u3002<br>OpenGL\u306e\u5834\u5408\u306f\u76f4\u65b9\u4f53\u306e\u4e2d\u5fc3\u304c\u539f\u70b9\u306b\u6765\u308b\u3088\u3046\u306b\u3059\u308c\u3070\u3044\u3044\u306e\u3067\u3001\u5e73\u884c\u79fb\u52d5\u3092\u884c\u3046\u884c\u5217\u3092$T$\u3068\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\nT=\n\\begin{pmatrix}\n    1 &amp; &amp; &amp; -\\frac{x_{\\rm{right}}+x_{\\rm{left}}}{2} \\\\\n    &amp; 1 &amp; &amp; -\\frac{y_{\\rm{top}}+y_{\\rm{bottom}}}{2} \\\\\n    &amp; &amp; 1 &amp; -\\frac{z_{\\rm{far}}+z_{\\rm{near}}}{2} \\\\\n    &amp; &amp; &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>Vulkan\u306e\u5834\u5408\u306f$z_{\\rm{near}}$\u306e\u9762\u304c$z=0$\u306b\u6765\u308c\u3070\u3044\u3044\u306e\u3067\u3001<\/p>\n\n\n\n<p>$$\nT=\n\\begin{pmatrix}\n    1 &amp; &amp; &amp; -\\frac{x_{\\rm{right}}+x_{\\rm{left}}}{2} \\\\\n    &amp; 1 &amp; &amp; -\\frac{y_{\\rm{top}}+y_{\\rm{bottom}}}{2} \\\\\n    &amp; &amp; 1 &amp; -z_{\\rm{near}} \\\\\n    &amp; &amp; &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u6b21\u306b\u3001\u62e1\u5927\u30fb\u7e2e\u5c0f\u3092\u884c\u3063\u3066\u3001\u76f4\u65b9\u4f53\u304c\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5168\u4f53\u3092\u5360\u3081\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<br>OpenGL\u306e\u5834\u5408\u306f\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u306e\u4e00\u8fba\u306e\u9577\u3055\u304c2\u306a\u306e\u3067\u3001\u76f4\u65b9\u4f53\u3092\u3053\u308c\u306b\u5408\u308f\u305b\u3066\u62e1\u5927\u30fb\u7e2e\u5c0f\u3057\u307e\u3059\u3002<br>(\u6ce8: \u5e73\u884c\u5c04\u5f71\u306e\u5834\u5408\u306f\u666e\u901a<code>gl_Position.w = 1<\/code>\u3068\u3059\u308b\u306e\u3067\u3001\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u306e\u4e00\u8fba\u306e\u9577\u3055\u306f1 &#8211; (-1) = 2\u3068\u306a\u308a\u307e\u3059)<\/p>\n\n\n\n<p>\u62e1\u5927\u30fb\u7e2e\u5c0f\u3092\u884c\u3046\u884c\u5217\u3092$S$\u3068\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\nS=\n\\begin{pmatrix}\n    \\frac{2}{x_{\\rm{right}}-x_{\\rm{left}}} &amp; &amp; &amp; \\\\\n    &amp; \\frac{2}{y_{\\rm{top}}-y_{\\rm{bottom}}} &amp; &amp; \\\\\n    &amp; &amp; \\frac{2}{z_{\\rm{far}}-z_{\\rm{near}}} &amp; \\\\\n    &amp; &amp; &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>Vulkan\u306e\u5834\u5408\u306f$z$\u65b9\u5411\u306e\u9577\u3055\u306f1\u306a\u306e\u3067\u3001<\/p>\n\n\n\n<p>$$\nS=\n\\begin{pmatrix}\n    \\frac{2}{x_{\\rm{right}}-x_{\\rm{left}}} &amp; &amp; &amp; \\\\\n    &amp; \\frac{2}{y_{\\rm{top}}-y_{\\rm{bottom}}} &amp; &amp; \\\\\n    &amp; &amp; \\frac{1}{z_{\\rm{far}}-z_{\\rm{near}}} &amp; \\\\\n    &amp; &amp; &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u3068\u3081\u308b\u3068\u3001\u5c04\u5f71\u884c\u5217$M_{\\rm{proj}}=ST$\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3068\u8a00\u3044\u305f\u3044\u3068\u3053\u308d\u3067\u3059\u304c\u3001\u4e0a\u306e\u5f0f\u3092\u305d\u306e\u307e\u307e\u5b9f\u88c5\u3059\u308b\u3068\u3001JOML\u306e\u51fa\u529b\u7d50\u679c\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002<br>\u5177\u4f53\u7684\u306b\u306f$z$\u6210\u5206\u306e\u62e1\u5927\u30fb\u7e2e\u5c0f\u3092\u884c\u3046\u90e8\u5206\u306e\u7b26\u53f7\u304c\u53cd\u8ee2\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u3002<br>\u3053\u308c\u304c\u4f55\u3092\u610f\u5473\u3057\u3066\u3044\u308b\u304b\u3068\u8a00\u3048\u3070\u3001\u3053\u308c\u307e\u3067\u53f3\u624b\u7cfb\u3092\u524d\u63d0\u306b\u3057\u3066\u3044\u307e\u3057\u305f\u304c\u3001\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u306f\u3069\u3046\u3084\u3089\u5de6\u624b\u7cfb\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u305d\u3046\u3060\u3001\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002<br>(\u81ea\u5206\u3082\u4eca\u307e\u3067\u6df1\u304f\u8003\u3048\u305f\u3053\u3068\u304c\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f)<\/p>\n\n\n\n<p>\u3053\u308c\u306b\u95a2\u3057\u3066\u5177\u4f53\u7684\u306a\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f\u898b\u3064\u3051\u3089\u308c\u306a\u304b\u3063\u305f\u306e\u3067\u3059\u304c\u3001Stack Overflow\u306a\u3069\u306e\u56de\u7b54\u3092\u53c2\u8003\u306b\u3059\u308b\u3068\u3001OpenGL\u306e\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3068\u305d\u306e\u5f8c\u306eNDC (Normalized Device Coordinates; \u6b63\u898f\u5316\u30c7\u30d0\u30a4\u30b9\u5ea7\u6a19)\u306f\u5de6\u624b\u7cfb\u306e\u3088\u3046\u3067\u3059\u3002<br>\u305d\u3082\u305d\u3082OpenGL\u3067\u53f3\u624b\u7cfb\u3092\u4f7f\u3046\u306e\u306f\u305f\u3060\u306e\u6163\u7fd2\u3089\u3057\u304f\u3001\u78ba\u304b\u306b\u3088\u304f\u8003\u3048\u3066\u307f\u308c\u3070\u3001\u3059\u3079\u3066\u5de6\u624b\u7cfb\u3092\u4f7f\u3046\u3088\u3046\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u305d\u3046\u3067\u3059\u3002<br>(Vulkan\u306e\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3068NDC\u306f\u53f3\u624b\u7cfb\u3067\u3059\u304c\u3001\u3053\u308c\u306b\u3064\u3044\u3066\u306f\u5f8c\u8ff0)<\/p>\n\n\n\n<p>\u53f3\u624b\u7cfb\u304b\u3089\u5de6\u624b\u7cfb\u3078\u306e\u5909\u63db\u306f\u3001$z$\u6210\u5206\u3092\u53cd\u8ee2\u3059\u308b\u884c\u5217$S_{\\rm{LH}}$\u3092\u4f7f\u3048\u3070\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>$$\nS_{\\rm{LH}}=\n\\begin{pmatrix}\n    1 &amp; &amp; &amp; \\\\\n    &amp; 1 &amp; &amp; \\\\\n    &amp; &amp; -1 &amp; \\\\\n    &amp; &amp; &amp; 1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3057\u305f\u304c\u3063\u3066\u3001\u6700\u7d42\u7684\u306a\u5c04\u5f71\u884c\u5217$M_{\\rm{proj}}$\u306f\u3001$M_{\\rm{proj}}=STS_{\\rm{LH}}$\u3068\u306a\u308a\u307e\u3059\u3002<br>\u307e\u305a\u4e16\u754c\u3092\u5de6\u624b\u7cfb\u306b\u5909\u63db\u3057\u3066\u304b\u3089\u3001\u5148\u306b\u793a\u3057\u305f\u5e73\u884c\u79fb\u52d5\u3068\u62e1\u5927\u30fb\u7e2e\u5c0f\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u5c04\u5f71\u884c\u5217\u304c\u6b63\u3057\u3044\u304b\u3069\u3046\u304b\u691c\u7b97\u3057\u3066\u307f\u307e\u3059\u3002<br>JOML\u3067\u306fMatrix4f.ortho\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u5e73\u884c\u5c04\u5f71\u3092\u884c\u3046\u884c\u5217\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-java\"><code class=\"language-java\">public static void main(String[] args) {\n    float right = 10.0f;\n    float left = -10.0f;\n    float top = 10.0f;\n    float bottom = -10.0f;\n    float near = 1.0f;\n    float far = 20.0f;\n\n    \/\/\u624b\u52d5\u3067\u5c04\u5f71\u884c\u5217\u3092\u4f5c\u6210\u3059\u308b\n    var tMat = new Matrix4f().translate(\n            -(right + left) \/ 2.0f,\n            -(top + bottom) \/ 2.0f,\n            -(far + near) \/ 2.0f\n    );\n    var tMatVk = new Matrix4f().translate(\n            -(right + left) \/ 2.0f,\n            -(top + bottom) \/ 2.0f,\n            -near\n    );\n\n    var sMat = new Matrix4f().scale(\n            2.0f \/ (right - left),\n            2.0f \/ (top - bottom),\n            2.0f \/ (far - near)\n    );\n    var sMatVk = new Matrix4f().scale(\n            2.0f \/ (right - left),\n            2.0f \/ (top - bottom),\n            1.0f \/ (far - near)\n    );\n\n    var sLHMat = new Matrix4f().scale(1.0f, 1.0f, -1.0f);\n\n    var projMat = new Matrix4f(sMat).mul(tMat).mul(sLHMat);\n    var projMatVk = new Matrix4f(sMatVk).mul(tMatVk).mul(sLHMat);\n\n    System.out.println(\"Manually created projection matrices are:\");\n    System.out.println(\"[OpenGL]\");\n    System.out.println(projMat);\n    System.out.println(\"[Vulkan]\");\n    System.out.println(projMatVk);\n\n    \/\/JOML\u306eortho\u30e1\u30bd\u30c3\u30c9\u3092\u5229\u7528\u3057\u3066\u5c04\u5f71\u884c\u5217\u3092\u4f5c\u6210\u3059\u308b\n    var projMat2 = new Matrix4f().ortho(left, right, bottom, top, near, far);\n    var projMatVk2 = new Matrix4f().ortho(left, right, bottom, top, near, far, true);\n\n    System.out.println(\"Projection matrices created by ortho method are:\");\n    System.out.println(\"[OpenGL]\");\n    System.out.println(projMat2);\n    System.out.println(\"[Vulkan]\");\n    System.out.println(projMatVk2);\n}<\/code><\/pre>\n\n\n\n<p>\u51fa\u529b\u7d50\u679c\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manually created projection matrices are:\n&#91;OpenGL]\n 1.000E-1  0.000E+0  0.000E+0  0.000E+0\n 0.000E+0  1.000E-1  0.000E+0  0.000E+0\n 0.000E+0  0.000E+0 -1.053E-1 -1.105E+0\n 0.000E+0  0.000E+0  0.000E+0  1.000E+0\n\n&#91;Vulkan]\n 1.000E-1  0.000E+0  0.000E+0  0.000E+0\n 0.000E+0  1.000E-1  0.000E+0  0.000E+0\n 0.000E+0  0.000E+0 -5.263E-2 -5.263E-2\n 0.000E+0  0.000E+0  0.000E+0  1.000E+0\n\nProjection matrices created by ortho method are:\n&#91;OpenGL]\n 1.000E-1  0.000E+0  0.000E+0 -0.000E+0\n 0.000E+0  1.000E-1  0.000E+0 -0.000E+0\n 0.000E+0  0.000E+0 -1.053E-1 -1.105E+0\n 0.000E+0  0.000E+0  0.000E+0  1.000E+0\n\n&#91;Vulkan]\n 1.000E-1  0.000E+0  0.000E+0 -0.000E+0\n 0.000E+0  1.000E-1  0.000E+0 -0.000E+0\n 0.000E+0  0.000E+0 -5.263E-2 -5.263E-2\n 0.000E+0  0.000E+0  0.000E+0  1.000E+0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E9%80%8F%E8%A6%96%E5%B0%84%E5%BD%B1\"><\/span>\u900f\u8996\u5c04\u5f71<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><strong>\u900f\u8996\u5c04\u5f71<\/strong>(perspective projection)\u3067\u306f\u9310\u53f0(frustum)\u306e\u4e2d\u306b\u3042\u308b\u9802\u70b9\u304c\u63cf\u753b\u3055\u308c\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<br>\u8fd1\u304f\u306e\u3082\u306e\u307b\u3069\u5927\u304d\u304f\u3001\u9060\u304f\u306e\u3082\u306e\u307b\u3069\u5c0f\u3055\u304f\u898b\u3048\u308b\u9060\u8fd1\u6cd5\u306e\u52b9\u679c\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/perspective_projection-1024x601.jpg\" alt=\"\u900f\u8996\u5c04\u5f71\" class=\"wp-image-911\" width=\"808\" height=\"474\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/perspective_projection-1024x601.jpg 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/perspective_projection-300x176.jpg 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/perspective_projection-768x450.jpg 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/perspective_projection.jpg 1282w\" sizes=\"auto, (max-width: 808px) 100vw, 808px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_3-1024x601.png\" alt=\"\u30af\u30ea\u30c3\u30d7\u7a7a\u95933\" class=\"wp-image-912\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_3-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_3-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_3-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/clip_coordinates_3.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u3053\u306e\u7a7a\u9593\u306b\u70b9$\\boldsymbol{p}=(x_p\\space y_p\\space z_p)^{\\rm{T}}$\u304c\u3042\u308b\u3068\u3057\u307e\u3059\u3002<br>\u3053\u306e\u70b9\u3092$z_{\\rm{near}}$\u306e\u9762\u306b\u5c04\u5f71\u3057\u305f\u3068\u304d\u3001\u305d\u306e\u5ea7\u6a19$\\boldsymbol{s}=(x_s\\space y_s\\space z_s)^{\\rm{T}}$\u306f\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_s&amp;=\\frac{x_p}{z_p}z_{\\rm{near}} \\\\\n        y_s&amp;=\\frac{y_p}{z_p}z_{\\rm{near}}\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<br>\u3053\u308c\u306f\u5358\u7d14\u306b\u4e00\u6b21\u95a2\u6570\u3068$z_{\\rm{near}}$\u9762\u3068\u306e\u4ea4\u70b9\u3092\u6c42\u3081\u3066\u3044\u308b\u3060\u3051\u3067\u3059\u3002<\/p>\n\n\n\n<p>$x_s$\u306f$x_{\\rm{left}}\\leq x_s\\leq x_{\\rm{right}}$\u3001$y_s$\u306f$y_{\\rm{bottom}}\\leq y_s\\leq y_{\\rm{top}}$\u306e\u7bc4\u56f2\u306b\u3042\u308b\u306e\u3067\u3001\u3053\u308c\u3092$[-1,1]$\u306e\u7bc4\u56f2\u306b\u306a\u308b\u3088\u3046\u306b\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u5f8c\u306e\u5ea7\u6a19\u3092$\\boldsymbol{s}&#8217;=(x_s&#8217;\\space y_s&#8217;\\space z_s&#8217;)^{\\rm{T}}$\u3068\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_s&#8217;&amp;=2\\cdot\\frac{x_s-x_{\\rm{left}}}{x_{\\rm{right}}-x_{\\rm{left}}}-1 \\\\\n        y_s&#8217;&amp;=2\\cdot\\frac{y_s-y_{\\rm{bottom}}}{y_{\\rm{top}}-y_{\\rm{bottom}}}-1\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3053\u308c\u306b\u5148\u306e\u5f0f\u3092\u4ee3\u5165\u3057\u3066\u6574\u7406\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_s&#8217;&amp;=\\frac{2z_{\\rm{near}}}{x_{\\rm{right}}-x_{\\rm{left}}}\\cdot\\frac{x_p}{z_p}-\\frac{x_{\\rm{right}}+x_{\\rm{left}}}{x_{\\rm{right}}-x_{\\rm{left}}} \\\\\n        y_s&#8217;&amp;=\\frac{2z_{\\rm{near}}}{y_{\\rm{top}}-y_{\\rm{bottom}}}\\cdot\\frac{y_p}{z_p}-\\frac{y_{\\rm{top}}+y_{\\rm{bottom}}}{y_{\\rm{top}}-y_{\\rm{bottom}}}\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>$z_s&#8217;$\u306b\u3064\u3044\u3066\u306f\u3001$\\frac{1}{z_p}$\u306b\u6bd4\u4f8b\u3059\u308b\u5024\u3092\u53d6\u308b\u3068\u8003\u3048\u3001<\/p>\n\n\n\n<p>$$\nz_s&#8217;=\\frac{A}{z_p}+B\n$$<\/p>\n\n\n\n<p>\u3068\u8868\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u3088\u3046\u306b\u8003\u3048\u308b\u7406\u7531\u3067\u3059\u304c\u3001$z_p$\u304c$z_{\\rm{near}}$\u306b\u8fd1\u3044\u3068\u304d(\u30ab\u30e1\u30e9\u306e\u8fd1\u304f\u306b\u3042\u308b\u9802\u70b9\u306e\u5834\u5408)\u306f\u3001\u3069\u306e\u9802\u70b9\u304c\u30ab\u30e1\u30e9\u306e\u3088\u308a\u8fd1\u304f\u306b\u3042\u308b\u306e\u304b\u3092\u9ad8\u3044\u7cbe\u5ea6\u3067\u5224\u5225\u3057\u305f\u3044\u306e\u306b\u5bfe\u3057\u3001$z_p$\u304c$z_{\\rm{far}}$\u306b\u8fd1\u3044\u3068\u304d(\u30ab\u30e1\u30e9\u304b\u3089\u9060\u304f\u306b\u3042\u308b\u9802\u70b9\u306e\u5834\u5408)\u306f\u3001\u305d\u308c\u307b\u3069\u7cbe\u5ea6\u304c\u6c42\u3081\u3089\u308c\u306a\u3044\u3053\u3068\u304c\u591a\u3044\u305f\u3081\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070\u3001\u76ee\u306e\u524d\u306e\u673a\u306b\u3042\u308b\u7a4d\u307f\u6728\u3092\u63cf\u753b\u3059\u308b\u3068\u304d\u306b\u306f\u3001\u3069\u306e\u7a4d\u307f\u6728\u304c\u3088\u308a\u30ab\u30e1\u30e9\u306e\u8fd1\u304f\u306b\u3042\u308b\u304b\u3068\u3044\u3046\u60c5\u5831\u304c\u91cd\u8981\u306a\u306e\u306b\u5bfe\u3057\u3001\u306f\u308b\u304b\u9060\u304f\u306e\u5165\u9053\u96f2\u3092\u63cf\u753b\u3059\u308b\u3068\u304d\u306b\u306f\u3001\u666e\u901a\u3069\u306e\u96f2\u304c\u4e00\u756a\u30ab\u30e1\u30e9\u306b\u8fd1\u3044\u304b\u3068\u3044\u3063\u305f\u60c5\u5831\u306f\u91cd\u8981\u3067\u306f\u306a\u304f\u3001\u3056\u3063\u304f\u308a\u3068\u3057\u305f\u7cbe\u5ea6\u3067\u524d\u5f8c\u3092\u5224\u5225\u3067\u304d\u308c\u3070\u554f\u984c\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>\u5177\u4f53\u7684\u306a\u30b0\u30e9\u30d5\u3067\u8868\u305b\u3070\u3001$z_p$\u3068$z_s&#8217;$\u306e\u95a2\u4fc2\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u305f\u3044\u3067\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/zp_and_zs.png\" alt=\"zp\u3068zs'\u306e\u95a2\u4fc2\" class=\"wp-image-925\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/zp_and_zs.png 640w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/zp_and_zs-300x225.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n<\/div>\n\n\n<p>\u3053\u306e\u30b0\u30e9\u30d5\u3067\u306f\u3001$z_{\\rm{near}}=10$\u3001$z_{\\rm{far}}=100$\u3068\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>$z_p$\u304c$z_{\\rm{near}}$\u306b\u8fd1\u3044\u3068\u304d\u306f$z_p$\u306e\u5fae\u5c0f\u306a\u5909\u5316\u3067\u3082$z_s&#8217;$\u304c\u5927\u304d\u304f\u5909\u5316\u3057\u3001\u9006\u306b$z_p$\u304c$z_{\\rm{far}}$\u306b\u8fd1\u3044\u3068\u304d\u306f\u591a\u5c11$z_p$\u304c\u5909\u5316\u3057\u3066\u3082$z_s&#8217;$\u306f\u5c11\u3057\u3057\u304b\u5909\u5316\u3057\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>$z_p=z_{\\rm{near}}$\u306e\u3068\u304d$z_s&#8217;=-1$\u3001$z_p=z_{\\rm{far}}$\u306e\u3068\u304d$z_s&#8217;=1$\u3068\u306a\u308b\u3088\u3046\u306b\u5148\u306e\u5f0f\u306e$A$\u3068$B$\u3092\u6c7a\u3081\u307e\u3059\u3002<\/p>\n\n\n\n<p>$A$\u3068$B$\u304c\u6e80\u305f\u3059\u6761\u4ef6\u306f\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        -1&amp;=\\frac{A}{z_{\\rm{near}}}+B \\\\\n        1&amp;=\\frac{A}{z_{\\rm{far}}}+B\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3053\u306e\u65b9\u7a0b\u5f0f\u3092\u89e3\u304f\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        A&amp;=-2\\cdot\\frac{z_{\\rm{far}}z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}} \\\\\n        B&amp;=\\frac{z_{\\rm{far}}+z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}}\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3057\u305f\u304c\u3063\u3066\u3001$z_s&#8217;$\u306f\u3001<\/p>\n\n\n\n<p>$$\nz_s&#8217;=-\\frac{2z_{\\rm{far}}z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}}\\cdot\\frac{1}{z_p}+\\frac{z_{\\rm{far}}+z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}}\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u3068\u3081\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_s&#8217;&amp;=\\frac{2z_{\\rm{near}}}{x_{\\rm{right}}-x_{\\rm{left}}}\\cdot\\frac{x_p}{z_p}-\\frac{x_{\\rm{right}}+x_{\\rm{left}}}{x_{\\rm{right}}-x_{\\rm{left}}} \\\\\n        y_s&#8217;&amp;=\\frac{2z_{\\rm{near}}}{y_{\\rm{top}}-y_{\\rm{bottom}}}\\cdot\\frac{y_p}{z_p}-\\frac{y_{\\rm{top}}+y_{\\rm{bottom}}}{y_{\\rm{top}}-y_{\\rm{bottom}}} \\\\\n        z_s&#8217;&amp;=-\\frac{2z_{\\rm{far}}z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}}\\cdot\\frac{1}{z_p}+\\frac{z_{\\rm{far}}+z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}}\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3053\u308c\u3092\u884c\u5217\u306e\u5f62\u306b\u3057\u305f\u3044\u3067\u3059\u304c\u3001$\\frac{1}{z_p}$\u3060\u3068\u90fd\u5408\u304c\u60aa\u3044\u306e\u3067\u3001\u4e21\u8fba\u306b$z_p$\u3092\u304b\u3051\u307e\u3059\u3002<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_s&#8217;z_p&amp;=\\frac{2z_{\\rm{near}}}{x_{\\rm{right}}-x_{\\rm{left}}}\\cdot x_p-\\frac{x_{\\rm{right}}+x_{\\rm{left}}}{x_{\\rm{right}}-x_{\\rm{left}}}\\cdot z_p \\\\\n        y_s&#8217;z_p&amp;=\\frac{2z_{\\rm{near}}}{y_{\\rm{top}}-y_{\\rm{bottom}}}\\cdot y_p-\\frac{y_{\\rm{top}}+y_{\\rm{bottom}}}{y_{\\rm{top}}-y_{\\rm{bottom}}}\\cdot z_p \\\\\n        z_s&#8217;z_p&amp;=-\\frac{2z_{\\rm{far}}z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}}+\\frac{z_{\\rm{far}}+z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}}\\cdot z_p\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3053\u306e\u8a08\u7b97\u3092\u884c\u5217\u306e\u5f62\u306b\u3059\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\n\\begin{pmatrix}\n    \\frac{2z_{\\rm{near}}}{x_{\\rm{right}}-x_{\\rm{left}}} &amp; 0 &amp; -\\frac{x_{\\rm{right}}+x_{\\rm{left}}}{x_{\\rm{right}}-x_{\\rm{left}}} &amp; 0 \\\\\n    0 &amp; \\frac{2z_{\\rm{near}}}{y_{\\rm{top}}-y_{\\rm{bottom}}} &amp; -\\frac{y_{\\rm{top}}+y_{\\rm{bottom}}}{y_{\\rm{top}}-y_{\\rm{bottom}}} &amp; 0 \\\\\n    0 &amp; 0 &amp; \\frac{z_{\\rm{far}}+z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}} &amp; -\\frac{2z_{\\rm{far}}z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}} \\\\\n    0 &amp; 0 &amp; 1 &amp; 0\n\\end{pmatrix}\n\\begin{pmatrix}\n    x_p \\\\\n    y_p \\\\\n    z_p \\\\\n    1\n\\end{pmatrix}\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u6ce8\u76ee\u3057\u3066\u307b\u3057\u3044\u306e\u306f\u5ea7\u6a19\u5909\u63db\u3092\u884c\u3063\u305f\u5f8c\u306e\u540c\u6b21\u5ea7\u6a19\u306e$w$\u6210\u5206\u3067\u3059\u3002<br>\u5909\u63db\u5f8c\u306e$w$\u6210\u5206\u306b\u306f$z_p$\u306e\u5024\u304c\u305d\u306e\u307e\u307e\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3059\u3002<br>$x_s&#8217;, y_s&#8217;, z_s&#8217;$\u306f$[-1,1]$\u306e\u7bc4\u56f2\u3092\u53d6\u308b\u306e\u3067\u3001\u305d\u308c\u306b$z_p$\u3092\u304b\u3051\u305f\u5024\u306f$[-z_p,z_p]$\u306e\u7bc4\u56f2\u3092\u53d6\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<br>\u3053\u306e\u7bc4\u56f2\u306f\u9802\u70b9\u306b\u3088\u3063\u3066\u7570\u306a\u308a\u307e\u3059\u304c\u3001\u91cd\u8981\u306a\u306e\u306f\u3001$z_p$\u3067\u5272\u308c\u3070$[-1,1]$\u306e\u7bc4\u56f2\u306b\u306a\u308b\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002<br>\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u306f\u9802\u70b9\u3054\u3068\u306b\u7570\u306a\u308b$[-z_p,z_p]$\u306e\u5024\u3092\u53d6\u308a\u307e\u3059\u304c\u3001\u3053\u306e\u5f8c\u306eNDC\u3067\u306f$[-1,1]$\u306e\u7bc4\u56f2\u306b\u53ce\u3081\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br>\u305d\u306e\u305f\u3081\u3001\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u306e$w$\u6210\u5206\u306b$z_p$\u306e\u5024\u3092\u4fdd\u6301\u3057\u3066\u304a\u304d\u3001\u5f8c\u306e\u51e6\u7406\u3067\u4f7f\u3048\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0a\u3088\u308a\u3001\u6700\u7d42\u7684\u306a\u5c04\u5f71\u884c\u5217$M_{\\rm{proj}}$\u306f\u3001$M_{\\rm{proj}}=M_{\\rm{perspective}}S_{\\rm{LH}}$\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>$$\n\\begin{align*}\n    M_{\\rm{proj}}&amp;=M_{\\rm{perspective}}S_{\\rm{LH}} \\\\\n    &amp;=\n    \\begin{pmatrix}\n        \\frac{2z_{\\rm{near}}}{x_{\\rm{right}}-x_{\\rm{left}}} &amp; 0 &amp; -\\frac{x_{\\rm{right}}+x_{\\rm{left}}}{x_{\\rm{right}}-x_{\\rm{left}}} &amp; 0 \\\\\n        0 &amp; \\frac{2z_{\\rm{near}}}{y_{\\rm{top}}-y_{\\rm{bottom}}} &amp; -\\frac{y_{\\rm{top}}+y_{\\rm{bottom}}}{y_{\\rm{top}}-y_{\\rm{bottom}}} &amp; 0 \\\\\n        0 &amp; 0 &amp; \\frac{z_{\\rm{far}}+z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}} &amp; -\\frac{2z_{\\rm{far}}z_{\\rm{near}}}{z_{\\rm{far}}-z_{\\rm{near}}} \\\\\n        0 &amp; 0 &amp; 1 &amp; 0\n    \\end{pmatrix}\n    \\begin{pmatrix}\n        1 &amp; &amp; &amp; \\\\\n        &amp; 1 &amp; &amp; \\\\\n        &amp; &amp; -1 &amp; \\\\\n        &amp; &amp; &amp; 1\n    \\end{pmatrix}\n\\end{align*}\n$$<\/p>\n\n\n\n<p>\u3068\u3053\u308d\u3067\u3001$x_{\\rm{left}},x_{\\rm{right}},y_{\\rm{bottom}},y_{\\rm{top}}$\u306f\u30ab\u30e1\u30e9\u306e\u30a2\u30b9\u30da\u30af\u30c8(\u753b\u89d2\u306e\u5e45\u3068\u9ad8\u3055\u306e\u6bd4\u7387)\u3068$x$\u65b9\u5411\u307e\u305f\u306f$y$\u65b9\u5411\u306eFOV (Field of View; \u753b\u89d2\u306e\u89d2\u5ea6)\u306e\u4e8c\u3064\u306e\u60c5\u5831\u304c\u3042\u308c\u3070\u8a08\u7b97\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>$y$\u65b9\u5411\u306eFOV\u3092$\\theta_y$\u3068\u3059\u308b\u3068\u3001$y_{\\rm{bottom}}$\u3068$y_{\\rm{top}}$\u306f\u305d\u308c\u305e\u308c\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        y_{\\rm{bottom}}&amp;=-z_{\\rm{near}}\\tan\\frac{\\theta_y}{2} \\\\\n        y_{\\rm{top}}&amp;=z_{\\rm{near}}\\tan\\frac{\\theta_y}{2}\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u30ab\u30e1\u30e9\u306e\u30a2\u30b9\u30da\u30af\u30c8\u3092$r$\u3068\u3059\u308b\u3068\u3001$r$\u306f<\/p>\n\n\n\n<p>$$\nr=\\frac{x_{\\rm{right}}-x_{\\rm{left}}}{y_{\\rm{top}}-y_{\\rm{bottom}}}\n$$<\/p>\n\n\n\n<p>\u3067\u3001\u3053\u308c\u3092\u7528\u3044\u308b\u3068\u3001<\/p>\n\n\n\n<p>$$\nx_{\\rm{right}}-x_{\\rm{left}}=r(y_{\\rm{top}}-y_{\\rm{bottom}})\n$$<\/p>\n\n\n\n<p>\u306a\u306e\u3067\u3001<\/p>\n\n\n\n<p>$$\n\\left\\{\n    \\begin{align*}\n        x_{\\rm{left}}&amp;=-\\frac{1}{2}r(y_{\\rm{top}}-y_{\\rm{bottom}}) \\\\\n        x_{\\rm{right}}&amp;=\\frac{1}{2}r(y_{\\rm{top}}-y_{\\rm{bottom}})\n    \\end{align*}\n\\right.\n$$<\/p>\n\n\n\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u3053\u3067\u6c42\u3081\u305f\u5c04\u5f71\u884c\u5217\u304c\u6b63\u3057\u3044\u304b\u3069\u3046\u304b\u691c\u7b97\u3057\u3066\u307f\u307e\u3059\u3002<br>JOML\u3067\u306fMatrix4f.perspective\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u900f\u8996\u5c04\u5f71\u3092\u884c\u3046\u884c\u5217\u3092\u4f5c\u6210\u3067\u304d\u307e\u3059\u3002<br>\u4eca\u56de\u306fOpenGL\u7528\u306e\u5c04\u5f71\u884c\u5217\u306e\u307f\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-java\"><code class=\"language-java\">public static void main(String[] args) {\n    float aspect = 1.0f;\n    float fovY = (float) Math.toRadians(60.0f);\n    float zNear = 1.0f;\n    float zFar = 100.0f;\n\n    \/\/\u624b\u52d5\u3067\u5c04\u5f71\u884c\u5217\u3092\u4f5c\u6210\u3059\u308b\n    float yTop = zNear * (float) Math.tan(fovY \/ 2.0f);\n    float yBottom = -yTop;\n    float xRight = aspect * (yTop - yBottom) \/ 2.0f;\n    float xLeft = -xRight;\n\n    var persMat = new Matrix4f().zero();\n    persMat.m00(2.0f * zNear \/ (xRight - xLeft));\n    persMat.m20(-(xRight + xLeft) \/ (xRight - xLeft));\n    persMat.m11(2.0f * zNear \/ (yTop - yBottom));\n    persMat.m21(-(yTop + yBottom) \/ (yTop - yBottom));\n    persMat.m22((zFar + zNear) \/ (zFar - zNear));\n    persMat.m32(-2.0f * zFar * zNear \/ (zFar - zNear));\n    persMat.m23(1.0f);\n\n    var sLHMat = new Matrix4f().scale(1.0f, 1.0f, -1.0f);\n\n    var projMat = new Matrix4f(persMat).mul(sLHMat);\n\n    System.out.println(\"Manually created projection matrix is:\");\n    System.out.println(projMat);\n\n    \/\/JOML\u306eperspective\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u5c04\u5f71\u884c\u5217\u3092\u4f5c\u6210\u3059\u308b\n    var projMat2 = new Matrix4f().perspective(fovY, aspect, zNear, zFar);\n\n    System.out.println(\"Projection matrix created by perspective method is:\");\n    System.out.println(projMat2);\n}<\/code><\/pre>\n\n\n\n<p>\u51fa\u529b\u7d50\u679c\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Manually created projection matrix is:\n 1.732E+0  0.000E+0  0.000E+0  0.000E+0\n 0.000E+0  1.732E+0  0.000E+0  0.000E+0\n 0.000E+0  0.000E+0 -1.020E+0 -2.020E+0\n 0.000E+0  0.000E+0 -1.000E+0  0.000E+0\n\nProjection matrix created by perspective method is:\n 1.732E+0  0.000E+0  0.000E+0  0.000E+0\n 0.000E+0  1.732E+0  0.000E+0  0.000E+0\n 0.000E+0  0.000E+0 -1.020E+0 -2.020E+0\n 0.000E+0  0.000E+0 -1.000E+0  0.000E+0<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E9%80%8F%E8%A6%96%E5%B0%84%E5%BD%B1%E3%82%92%E8%A1%8C%E3%81%86%E5%A0%B4%E5%90%88%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9\"><\/span>\u900f\u8996\u5c04\u5f71\u3092\u884c\u3046\u5834\u5408\u306e\u6ce8\u610f\u70b9<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>\u900f\u8996\u5c04\u5f71\u3092\u884c\u3046\u5834\u5408\u3001$z_{\\rm{near}}$\u306f\u53ef\u80fd\u306a\u9650\u308a\u5927\u304d\u304f\u3001$z_{\\rm{far}}$\u306f\u53ef\u80fd\u306a\u9650\u308a\u5c0f\u3055\u304f\u8a2d\u5b9a\u3059\u308b\u306e\u304c\u57fa\u672c\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u5148\u306b\u793a\u3057\u305f\u3068\u304a\u308a\u3001\u900f\u8996\u5c04\u5f71\u3067\u306f$z$\u304c$z_{\\rm{near}}$\u306b\u8fd1\u3044\u3068\u304d\u306f\u9ad8\u3044\u7cbe\u5ea6\u3067\u524d\u5f8c\u3092\u5224\u5225\u3067\u304d\u307e\u3059\u304c\u3001$z_{\\rm{far}}$\u306b\u8fd1\u3065\u304f\u306b\u3064\u308c\u3066\u7cbe\u5ea6\u304c\u8352\u304f\u306a\u308a\u307e\u3059\u3002<br>\u30b2\u30fc\u30e0\u3092\u30d7\u30ec\u30a4\u3057\u3066\u3044\u3066\u3001\u9060\u304f\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u3061\u3089\u3064\u304f\u3068\u3044\u3046\u73fe\u8c61\u306b\u906d\u9047\u3057\u305f\u3053\u3068\u304c\u3042\u308b\u65b9\u3082\u3044\u308b\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u3053\u308c\u306f\u4f3c\u305f\u3088\u3046\u306a\u8ddd\u96e2\u306b\u3042\u308b\u8907\u6570\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u524d\u5f8c\u3092\u6b63\u3057\u304f\u5224\u5b9a\u3067\u304d\u306a\u3044\u3053\u3068\u306b\u3088\u3063\u3066\u751f\u3058\u308b\u73fe\u8c61\u3067\u3001<a href=\"https:\/\/en.wikipedia.org\/wiki\/Z-fighting\" target=\"_blank\" rel=\"noreferrer noopener\">Z-fighting<\/a>\u3068\u547c\u3070\u308c\u307e\u3059\u3002<\/p>\n\n\n\n<p>$z_{\\rm{far}}\/z_{\\rm{near}}$\u306e\u5024\u304c\u6975\u7aef\u306b\u5927\u304d\u3044\u3068Z-fighting\u304c\u8d77\u3053\u308a\u3084\u3059\u3044\u305f\u3081\u3001\u6ce8\u610f\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Vulkan%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%B0%84%E5%BD%B1%E8%A1%8C%E5%88%97\"><\/span>Vulkan\u306b\u304a\u3051\u308b\u5c04\u5f71\u884c\u5217<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>OpenGL\u3067\u306f\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3068\u305d\u306e\u5f8c\u306eNDC\u306f\u5de6\u624b\u7cfb\u3067\u3059\u304c\u3001Vulkan\u3067\u306f\u53f3\u624b\u7cfb\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u305f\u3068\u3048\u3070Mechtatel\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u306e$y$\u8ef8\u3092\u53cd\u8ee2\u3059\u308b\u51e6\u7406\u3092\u884c\u3046\u3053\u3068\u3067\u3001\u5ea7\u6a19\u304cVulkan\u3067\u4f7f\u7528\u3055\u308c\u308b\u53f3\u624b\u7cfb\u306b\u4e00\u81f4\u3059\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-luxe-blocks-syntaxhighlighter line-numbers language-java\"><code class=\"language-java\">proj = new Matrix4f()\n        .scale(1.0f, -1.0f, 1.0f)\n        .perspective(cameraInfo.fovY, cameraInfo.aspect, zNear, zFar, true);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E5%BA%A7%E6%A8%99\"><\/span>\u6b63\u898f\u5316\u30c7\u30d0\u30a4\u30b9\u5ea7\u6a19<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><code>gl_Position<\/code>\u306b\u306f\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u304c\u30bb\u30c3\u30c8\u3055\u308c\u3066\u304a\u308a\u3001\u305d\u306e$x,y$\u6210\u5206\u306f[-gl_Position.w, gl_Position.w]\u306e\u5024\u3092\u53d6\u308a\u307e\u3059\u3002<br>$z$\u6210\u5206\u306f\u3001OpenGL\u306e\u5834\u5408[-gl_Position.w, gl_Position.w]\u3001Vulkan\u306e\u5834\u5408[0, gl_Position.w]\u306e\u5024\u3092\u53d6\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\u6b63\u898f\u5316\u30c7\u30d0\u30a4\u30b9\u5ea7\u6a19<\/strong>(Normalized Device Coordinates; <strong>NDC<\/strong>)\u306f\u3053\u308c\u3089\u306e\u5024\u3092\u6b63\u898f\u5316\u3057\u305f\u3082\u306e\u306b\u306a\u308a\u307e\u3059\u3002<br>\u5177\u4f53\u7684\u306b\u306f\u3001$x$\u6210\u5206\u3068$y$\u6210\u5206\u306f$[-1,1]$\u3001$z$\u6210\u5206\u306b\u3064\u3044\u3066\u306fOpenGL\u306e\u5834\u5408$[-1,1]$\u3001Vulkan\u306e\u5834\u5408$[0,1]$\u3068\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u5148\u306b\u793a\u3057\u305f\u3088\u3046\u306b\u3001<code>gl_Position<\/code>\u306e\u5404\u6210\u5206\u3092$w$\u6210\u5206\u3067\u5272\u308b\u3053\u3068\u3067\u6b63\u898f\u5316\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br>\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u304b\u3089NDC\u3078\u306e\u5909\u63db\u306fOpenGL\u3084Vulkan\u5074\u3067\u81ea\u52d5\u7684\u306b\u884c\u308f\u308c\u308b\u305f\u3081\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u660e\u793a\u7684\u306b\u884c\u3046\u5fc5\u8981\u306f\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3092\u3042\u3089\u304b\u3058\u3081\u6b63\u898f\u5316\u3057\u3066\u304a\u3051\u3070\u3044\u3044\u306e\u3067\u306f\u3001\u3068\u601d\u308f\u308c\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<br>\u5177\u4f53\u7684\u306b\u306f\u3001\u305f\u3068\u3048\u3070\u9802\u70b9\u30b7\u30a7\u30fc\u30c0\u30fc\u3067\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u51e6\u7406\u3092\u660e\u793a\u7684\u306b\u884c\u3063\u3066\u304a\u3051\u3070\u3044\u3044\u306e\u3067\u306f\u3001\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gl_Position\/=gl_Position.w;<\/code><\/pre>\n\n\n\n<p>\u9802\u70b9\u30b7\u30a7\u30fc\u30c0\u30fc\u306f\u5404\u9802\u70b9\u306b\u3064\u3044\u3066\u5b9f\u884c\u3055\u308c\u307e\u3059\u304c\u3001\u305d\u306e\u5f8c\u306e\u30d5\u30e9\u30b0\u30e1\u30f3\u30c8\u30b7\u30a7\u30fc\u30c0\u30fc\u306f\u51fa\u529b\u753b\u50cf\u306e\u5404\u30d4\u30af\u30bb\u30eb\u306b\u3064\u3044\u3066\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002<br>\u9802\u70b9\u9593\u306b\u3042\u308b\u30d4\u30af\u30bb\u30eb\u306e\u8272\u3084NDC\u306f\u5404\u9802\u70b9\u306e\u5024\u304b\u3089\u7dda\u5f62\u88dc\u9593\u3055\u308c\u307e\u3059\u3002<br>\u30c6\u30af\u30b9\u30c1\u30e3\u5ea7\u6a19\u3082\u5404\u9802\u70b9\u306e\u5024\u304b\u3089\u88dc\u9593\u3055\u308c\u307e\u3059\u304c\u3001\u3053\u306e\u88dc\u9593\u306f\u5358\u7d14\u306a\u7dda\u5f62\u88dc\u9593\u3067\u306f\u306a\u304f\u3001\u9060\u8fd1\u6cd5\u3092\u8003\u616e\u3057\u305f\u3082\u306e\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<br>\u30c6\u30af\u30b9\u30c1\u30e3\u5ea7\u6a19\u306e\u88dc\u9593\u3092\u884c\u3046\u305f\u3081\u306b\u3001\u30d3\u30e5\u30fc\u7a7a\u9593\u3067\u306e$z$\u5ea7\u6a19\u306e\u5024\u304c\u5fc5\u8981\u306b\u306a\u308b\u305f\u3081\u3001<code>gl_Position<\/code>\u306b\u306f\u6b63\u898f\u5316\u3057\u3066\u3044\u306a\u3044\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3092\u30bb\u30c3\u30c8\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u306e\u3067\u3059\u3002<br>\u3053\u306e\u88dc\u9593\u51e6\u7406\u306b\u3064\u3044\u3066\u306f\u3001<a href=\"https:\/\/webglfundamentals.org\/webgl\/lessons\/webgl-3d-perspective-correct-texturemapping.html\" target=\"_blank\" rel=\"noreferrer noopener\">\u3053\u306e\u30b5\u30a4\u30c8<\/a>\u3067\u8a73\u3057\u304f\u8aac\u660e\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>gl_Position<\/code>\u306b\u3042\u3089\u304b\u3058\u3081\u6b63\u898f\u5316\u3055\u308c\u305f\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\u5ea7\u6a19\u3092\u30bb\u30c3\u30c8\u3057\u305f\u5834\u5408\u3068\u305d\u3046\u3067\u306a\u3044\u5834\u5408\u306e\u63cf\u753b\u7d50\u679c\u3092\u4ee5\u4e0b\u306b\u793a\u3057\u307e\u3059\u3002<br><code>gl_Position<\/code>\u3092\u3042\u3089\u304b\u3058\u3081\u6b63\u898f\u5316\u3057\u3066\u3044\u308b\u5834\u5408\u306b\u306f\u3001\u30c6\u30af\u30b9\u30c1\u30e3\u5ea7\u6a19\u306f\u5358\u7d14\u306b\u7dda\u5f62\u88dc\u9593\u3055\u308c\u305f\u5024\u3068\u306a\u308a\u3001\u898b\u305f\u76ee\u306b\u6b6a\u307f\u304c\u751f\u3058\u3066\u3044\u308b\u306e\u304c\u308f\u304b\u308b\u304b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p><code>gl_Position<\/code>\u3092\u3042\u3089\u304b\u3058\u3081\u6b63\u898f\u5316\u3057\u305f\u5834\u5408<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/warped_checker-1024x601.png\" alt=\"\u6b6a\u3093\u3060\u30c1\u30a7\u30c3\u30ab\u30fc\" class=\"wp-image-913\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/warped_checker-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/warped_checker-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/warped_checker-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/warped_checker.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><code>gl_Position<\/code>\u3092\u6b63\u898f\u5316\u3057\u306a\u3044\u5834\u5408<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/correct_checker-1024x601.png\" alt=\"\u6b63\u3057\u3044\u30c1\u30a7\u30c3\u30ab\u30fc\" class=\"wp-image-914\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/correct_checker-1024x601.png 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/correct_checker-300x176.png 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/correct_checker-768x450.png 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/correct_checker.png 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E7%A9%BA%E9%96%93%E5%BA%A7%E6%A8%99\"><\/span>\u30b9\u30af\u30ea\u30fc\u30f3\u7a7a\u9593\u5ea7\u6a19<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p><strong>\u30b9\u30af\u30ea\u30fc\u30f3\u7a7a\u9593\u5ea7\u6a19<\/strong>(screen-space coordinates)\u306f\u63cf\u753b\u7d50\u679c\u3092\u51fa\u529b\u3059\u308b\u753b\u50cf\u3001\u3072\u3044\u3066\u306f\u63cf\u753b\u7d50\u679c\u3092\u8868\u793a\u3059\u308b\u30a6\u30a3\u30f3\u30c9\u30a6\u306e\u5ea7\u6a19\u3067\u3059\u3002<br>NDC\u304b\u3089\u30b9\u30af\u30ea\u30fc\u30f3\u7a7a\u9593\u5ea7\u6a19\u3078\u306e\u30de\u30c3\u30d4\u30f3\u30b0(\u30d3\u30e5\u30fc\u30dd\u30fc\u30c8\u5909\u63db(viewport transformation))\u306f\u81ea\u52d5\u7684\u306b\u884c\u308f\u308c\u307e\u3059\u3002<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"601\" src=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/viewport-1024x601.jpg\" alt=\"\u30d3\u30e5\u30fc\u30dd\u30fc\u30c8\" class=\"wp-image-915\" srcset=\"https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/viewport-1024x601.jpg 1024w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/viewport-300x176.jpg 300w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/viewport-768x450.jpg 768w, https:\/\/daba-no-heya.com\/wp-content\/uploads\/2023\/06\/viewport.jpg 1400w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p>\u30d3\u30e5\u30fc\u30dd\u30fc\u30c8\u306e\u539f\u70b9\u3084\u5927\u304d\u3055\u306f\u3001OpenGL\u306a\u3089<a href=\"https:\/\/registry.khronos.org\/OpenGL-Refpages\/gl4\/html\/glViewport.xhtml\" target=\"_blank\" rel=\"noreferrer noopener\">glViewport<\/a>\u95a2\u6570\u3001Vulkan\u306a\u3089<a href=\"https:\/\/registry.khronos.org\/vulkan\/specs\/1.3-extensions\/man\/html\/VkViewport.html\" target=\"_blank\" rel=\"noreferrer noopener\">VkViewport<\/a>\u69cb\u9020\u4f53\u3067\u8a2d\u5b9a\u3057\u307e\u3059\u3002<br>OpenGL\u3067\u306f\u30d3\u30e5\u30fc\u30dd\u30fc\u30c8\u306e\u5de6\u4e0b\u3092\u539f\u70b9\u3068\u3057\u3066\u53f3\u65b9\u5411\u306b$x$\u8ef8\u6b63\u306e\u5411\u304d\u3001\u4e0a\u65b9\u5411\u306b$y$\u8ef8\u6b63\u306e\u5411\u304d\u3092\u53d6\u308a\u307e\u3059(\u5de6\u624b\u7cfb)\u3002<br>\u4e00\u65b9Vulkan\u3067\u306f\u30d3\u30e5\u30fc\u30dd\u30fc\u30c8\u306e\u5de6\u4e0a\u3092\u539f\u70b9\u3068\u3057\u3066\u53f3\u65b9\u5411\u306b$x$\u8ef8\u6b63\u306e\u5411\u304d\u3001\u4e0b\u65b9\u5411\u306b$y$\u8ef8\u6b63\u306e\u5411\u304d\u3092\u53d6\u308a\u307e\u3059(\u53f3\u624b\u7cfb)\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%81%BE%E3%81%A8%E3%82%81\"><\/span>\u307e\u3068\u3081<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>\u304b\u306a\u308a\u9577\u3044\u8a18\u4e8b\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u304c\u3001\u9802\u70b9\u30b7\u30a7\u30fc\u30c0\u30fc\u3067\u884c\u3063\u3066\u3044\u308b\u5ea7\u6a19\u5909\u63db\u306e\u6d41\u308c\u3068\u3057\u3066\u306f\u3053\u3093\u306a\u611f\u3058\u3067\u3059\u3002<br>\u8a18\u4e8b\u306e\u5185\u5bb9\u306b\u9593\u9055\u3044\u306a\u3069\u3042\u308a\u307e\u3057\u305f\u3089\u3001\u7ba1\u7406\u4eba\u307e\u3067\u9023\u7d61\u3057\u3066\u3044\u305f\u3060\u3051\u308b\u3068\u3042\u308a\u304c\u305f\u3044\u3067\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7ba1\u7406\u4eba\u306f\u73fe\u5728\u3001Mechtatel\u3068\u3044\u3046\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u3092\u958b\u767a\u3057\u3066\u3044\u307e\u3059\u3002(\u307e\u3060\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u3068\u547c\u3079\u308b\u3088\u3046\u306a\u30af\u30aa\u30ea\u30c6\u30a3\u3067\u306f\u306a\u3044\u3067\u3059\u304c\u2026) \u3053\u306e\u8a18\u4e8b\u3067\u89e3\u8aac\u3059\u308b\u306e\u306f\u9802\u70b9\u30b7\u30a7\u30fc\u30c0(vertex shader)\u3067\u884c\u3063\u3066\u3044\u308b\u4ee5\u4e0b\u306e\u3088\u3046 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,8],"tags":[],"class_list":["post-903","post","type-post","status-publish","format-standard","hentry","category-3d","category-8"],"_links":{"self":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts\/903","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=903"}],"version-history":[{"count":10,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts\/903\/revisions"}],"predecessor-version":[{"id":926,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=\/wp\/v2\/posts\/903\/revisions\/926"}],"wp:attachment":[{"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=903"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=903"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daba-no-heya.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=903"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}