{"id":12316,"date":"2025-08-15T00:59:33","date_gmt":"2025-08-14T15:59:33","guid":{"rendered":"https:\/\/www.webcyou.com\/?p=12316"},"modified":"2025-08-15T01:29:28","modified_gmt":"2025-08-14T16:29:28","slug":"%e3%82%b2%e3%83%bc%e3%83%a0%e9%96%8b%e7%99%ba%e3%81%ab%e5%bf%85%e8%a6%81%e3%81%aa%e5%9f%ba%e6%9c%ac%e6%95%b0%e5%ad%a6%e5%85%a5%e9%96%80","status":"publish","type":"post","link":"https:\/\/www.webcyou.com\/?p=12316","title":{"rendered":"\u30b2\u30fc\u30e0\u958b\u767a\u306b\u5fc5\u8981\u306a\u57fa\u672c\u6570\u5b66\u5165\u9580"},"content":{"rendered":"\n<p>\u3069\u3082\u3067\u3059\u3002<\/p>\n<p>\u30b2\u30fc\u30e0\u958b\u767a\u3067\u306f\u3001\u898b\u305f\u76ee\u306e\u6d3e\u624b\u3055\u3084\u30b9\u30c8\u30fc\u30ea\u30fc\u3082\u5927\u4e8b\u3067\u3059\u304c\u3001\u88cf\u5074\u3067\u306f<strong data-start=\"144\" data-end=\"150\">\u6570\u5b66<\/strong>\u304c\u591a\u304f\u306e\u8868\u73fe\u3084\u6319\u52d5\u3092\u652f\u3048\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001\u7279\u306b\u30b2\u30fc\u30e0\u306e\u57fa\u790e\u3092\u5f62\u4f5c\u308b\u300c\u7dda\u5f62\u88dc\u9593\u300d\u300c\u4e09\u89d2\u95a2\u6570\u300d\u300c\u884c\u5217\u300d\u300c\u56de\u8ee2\u300d\u306e\u57fa\u672c\u3068\u6d3b\u7528\u3092\u307e\u3068\u3081\u307e\u3059\u3002<\/p>\n<h4 data-start=\"229\" data-end=\"261\">1. \u7dda\u5f62\u88dc\u9593\uff08Linear Interpolation\uff09<\/h4>\n<h5 data-start=\"263\" data-end=\"269\">\u6982\u8981<\/h5>\n<p data-start=\"270\" data-end=\"326\">2\u3064\u306e\u5024\u306e\u9593\u3092\u4e00\u5b9a\u5272\u5408\u3067\u88dc\u3046\u8a08\u7b97\u3002<br data-start=\"287\" data-end=\"290\" \/><code data-start=\"290\" data-end=\"296\">Lerp<\/code>\uff08Linear Interpolation\uff09\u3068\u3082\u547c\u3070\u308c\u307e\u3059\u3002<\/p>\n<h5 data-start=\"328\" data-end=\"334\">\u6570\u5f0f<\/h5>\n<div class=\"contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary\">\n<div class=\"flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary select-none rounded-t-2xl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Lerp(a, b, t) = a + (b - a) * t<\/pre>\n<\/div>\n<\/div>\n<ul data-start=\"375\" data-end=\"418\">\n<li data-start=\"375\" data-end=\"386\">\n<p data-start=\"377\" data-end=\"386\"><code data-start=\"377\" data-end=\"380\">a<\/code> \u2026 \u958b\u59cb\u5024<\/p>\n<\/li>\n<li data-start=\"387\" data-end=\"398\">\n<p data-start=\"389\" data-end=\"398\"><code data-start=\"389\" data-end=\"392\">b<\/code> \u2026 \u7d42\u4e86\u5024<\/p>\n<\/li>\n<li data-start=\"399\" data-end=\"418\">\n<p data-start=\"401\" data-end=\"418\"><code data-start=\"401\" data-end=\"404\">t<\/code> \u2026 0.0\uff5e1.0 \u306e\u5272\u5408<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"401\" data-end=\"418\"><span style=\"color: revert; font-size: revert; font-weight: revert; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\">\u6d3b\u7528\u4f8b<\/span><\/h5>\n<ul data-start=\"428\" data-end=\"480\">\n<li data-start=\"428\" data-end=\"442\">\n<p data-start=\"430\" data-end=\"442\">\u7269\u4f53\u306e\u4f4d\u7f6e\u3092\u6ed1\u3089\u304b\u306b\u79fb\u52d5<\/p>\n<\/li>\n<li data-start=\"443\" data-end=\"461\">\n<p data-start=\"445\" data-end=\"461\">\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u306e\u4e2d\u9593\u30d5\u30ec\u30fc\u30e0\u751f\u6210<\/p>\n<\/li>\n<li data-start=\"462\" data-end=\"480\">\n<p data-start=\"464\" data-end=\"480\">\u8272\u306e\u30d5\u30a7\u30fc\u30c9\u30a4\u30f3\u30fb\u30d5\u30a7\u30fc\u30c9\u30a2\u30a6\u30c8<\/p>\n<\/li>\n<\/ul>\n<h4 data-start=\"487\" data-end=\"511\">2. \u4e09\u89d2\u95a2\u6570\uff08Trigonometry\uff09<\/h4>\n<h5 data-start=\"513\" data-end=\"527\">Angles\uff08\u89d2\u5ea6\uff09<\/h5>\n<ul data-start=\"528\" data-end=\"600\">\n<li data-start=\"528\" data-end=\"552\">\n<p data-start=\"530\" data-end=\"552\"><strong data-start=\"530\" data-end=\"544\">\u5ea6\uff08degrees\uff09<\/strong>\uff1a0\u00b0\u301c360\u00b0<\/p>\n<\/li>\n<li data-start=\"553\" data-end=\"600\">\n<p data-start=\"555\" data-end=\"600\"><strong data-start=\"555\" data-end=\"572\">\u30e9\u30b8\u30a2\u30f3\uff08radians\uff09<\/strong>\uff1a0\u301c2\u03c0<br data-start=\"577\" data-end=\"580\" \/>\u591a\u304f\u306e\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u306f\u30e9\u30b8\u30a2\u30f3\u3092\u4f7f\u7528<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"602\" data-end=\"606\">\u5909\u63db\u5f0f\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">radians = degrees \u00d7 \u03c0 \/ 180\ndegrees = radians \u00d7 180 \/ \u03c0<\/pre>\n<p data-start=\"602\" data-end=\"606\">\u00a0<\/p>\n<h5 data-start=\"672\" data-end=\"689\">Vectors\uff08\u30d9\u30af\u30c8\u30eb\uff09<\/h5>\n<p data-start=\"690\" data-end=\"746\">\u30d9\u30af\u30c8\u30eb\u306f\u4f4d\u7f6e\u3084\u65b9\u5411\u3092\u8868\u3059\u57fa\u672c\u8981\u7d20\u3002<br data-start=\"708\" data-end=\"711\" \/>2D\u306a\u3089 <code data-start=\"716\" data-end=\"724\">(x, y)<\/code>\u30013D\u306a\u3089 <code data-start=\"730\" data-end=\"741\">(x, y, z)<\/code> \u3067\u8868\u73fe\u3002<\/p>\n<ul data-start=\"748\" data-end=\"847\">\n<li data-start=\"748\" data-end=\"786\">\n<p data-start=\"750\" data-end=\"786\"><strong data-start=\"750\" data-end=\"768\">\u6b63\u898f\u5316\uff08normalize\uff09<\/strong>\uff1a\u9577\u3055\u30921\u306b\u3059\u308b\u3053\u3068\u3067\u65b9\u5411\u3060\u3051\u3092\u4fdd\u6301<\/p>\n<\/li>\n<li data-start=\"787\" data-end=\"814\">\n<p data-start=\"789\" data-end=\"814\"><strong data-start=\"789\" data-end=\"800\">\u5185\u7a4d\uff08dot\uff09<\/strong>\uff1a\u89d2\u5ea6\u3084\u5411\u304d\u306e\u985e\u4f3c\u5ea6\u3092\u6c42\u3081\u308b<\/p>\n<\/li>\n<li data-start=\"815\" data-end=\"847\">\n<p data-start=\"817\" data-end=\"847\"><strong data-start=\"817\" data-end=\"830\">\u5916\u7a4d\uff08cross\uff09<\/strong>\uff1a3D\u3067\u5782\u76f4\u65b9\u5411\u306e\u30d9\u30af\u30c8\u30eb\u3092\u6c42\u3081\u308b<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"849\" data-end=\"856\">\u6d3b\u7528\u4f8b<\/h5>\n<ul data-start=\"857\" data-end=\"896\">\n<li data-start=\"857\" data-end=\"868\">\n<p data-start=\"859\" data-end=\"868\">\u5f3e\u4e38\u306e\u9032\u884c\u65b9\u5411\u8a08\u7b97<\/p>\n<\/li>\n<li data-start=\"869\" data-end=\"885\">\n<p data-start=\"871\" data-end=\"885\">\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u304c\u5411\u304f\u65b9\u5411\u306e\u8a08\u7b97<\/p>\n<\/li>\n<li data-start=\"886\" data-end=\"896\">\n<p data-start=\"888\" data-end=\"896\">\u30ab\u30e1\u30e9\u306e\u56de\u8ee2\u5236\u5fa1<\/p>\n<\/li>\n<\/ul>\n<h4 data-start=\"903\" data-end=\"921\">3. \u884c\u5217\uff08Matrices\uff09<\/h4>\n<h5 data-start=\"923\" data-end=\"929\">\u6982\u8981<\/h5>\n<p data-start=\"930\" data-end=\"1007\">\u884c\u5217\u306f\u4f4d\u7f6e\u30fb\u56de\u8ee2\u30fb\u62e1\u7e2e\u3092\u3072\u3068\u307e\u3068\u3081\u306b\u5909\u63db\u3059\u308b\u6570\u5b66\u7684\u30c4\u30fc\u30eb\u3002<br data-start=\"959\" data-end=\"962\" \/>\u30b2\u30fc\u30e0\u3067\u306f\u7279\u306b\u300c\u5909\u63db\u884c\u5217\uff08Transformation Matrix\uff09\u300d\u304c\u3088\u304f\u4f7f\u308f\u308c\u307e\u3059\u3002<\/p>\n<h5 data-start=\"1009\" data-end=\"1019\">\u4ee3\u8868\u7684\u306a\u884c\u5217<\/h5>\n<ul data-start=\"1020\" data-end=\"1084\">\n<li data-start=\"1020\" data-end=\"1042\">\n<p data-start=\"1022\" data-end=\"1042\"><strong data-start=\"1022\" data-end=\"1032\">\u5e73\u884c\u79fb\u52d5\u884c\u5217<\/strong>\uff1a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u79fb\u52d5<\/p>\n<\/li>\n<li data-start=\"1043\" data-end=\"1063\">\n<p data-start=\"1045\" data-end=\"1063\"><strong data-start=\"1045\" data-end=\"1053\">\u56de\u8ee2\u884c\u5217<\/strong>\uff1a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u56de\u8ee2<\/p>\n<\/li>\n<li data-start=\"1064\" data-end=\"1084\">\n<p data-start=\"1066\" data-end=\"1084\"><strong data-start=\"1066\" data-end=\"1078\">\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u884c\u5217<\/strong>\uff1a\u62e1\u5927\u30fb\u7e2e\u5c0f<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"1086\" data-end=\"1093\">\u6d3b\u7528\u4f8b<\/h5>\n<ul data-start=\"1094\" data-end=\"1145\">\n<li data-start=\"1094\" data-end=\"1119\">\n<p data-start=\"1096\" data-end=\"1119\">\u30e2\u30c7\u30eb\u306e\u5ea7\u6a19\u5909\u63db\uff08\u30ed\u30fc\u30ab\u30eb\u5ea7\u6a19\u2192\u30ef\u30fc\u30eb\u30c9\u5ea7\u6a19\uff09<\/p>\n<\/li>\n<li data-start=\"1120\" data-end=\"1130\">\n<p data-start=\"1122\" data-end=\"1130\">\u30ab\u30e1\u30e9\u8996\u70b9\u306e\u5909\u63db<\/p>\n<\/li>\n<li data-start=\"1131\" data-end=\"1145\">\n<p data-start=\"1133\" data-end=\"1145\">\u30b9\u30d7\u30e9\u30a4\u30c8\u306e\u56de\u8ee2\u3084\u30ba\u30fc\u30e0<\/p>\n<\/li>\n<\/ul>\n<h4 data-start=\"1152\" data-end=\"1171\">4. \u56de\u8ee2\uff08Rotations\uff09<\/h4>\n<p data-start=\"1173\" data-end=\"1200\">\u56de\u8ee2\u306e\u8868\u73fe\u65b9\u6cd5\u306f\u8907\u6570\u3042\u308a\u3001\u305d\u308c\u305e\u308c\u4e00\u9577\u4e00\u77ed\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<h5 data-start=\"1202\" data-end=\"1226\">\u30b8\u30f3\u30d0\u30eb\u30ed\u30c3\u30af\uff08Gimbal Lock\uff09<\/h5>\n<ul data-start=\"1227\" data-end=\"1306\">\n<li data-start=\"1227\" data-end=\"1260\">\n<p data-start=\"1229\" data-end=\"1260\"><strong data-start=\"1229\" data-end=\"1235\">\u539f\u56e0<\/strong>\uff1a3\u8ef8\u306e\u3046\u30612\u8ef8\u304c\u540c\u3058\u65b9\u5411\u3092\u5411\u304d\u3001\u81ea\u7531\u5ea6\u304c\u5931\u308f\u308c\u308b<\/p>\n<\/li>\n<li data-start=\"1261\" data-end=\"1306\">\n<p data-start=\"1263\" data-end=\"1306\"><strong data-start=\"1263\" data-end=\"1270\">\u767a\u751f\u4f8b<\/strong>\uff1aEuler\u89d2\u3067\u306e\u56de\u8ee2\u4e2d\u306b\u7279\u5b9a\u306e\u89d2\u5ea6\u306b\u306a\u308b\u3068\u3001\u56de\u8ee2\u304c\u601d\u3063\u305f\u901a\u308a\u306b\u306a\u3089\u306a\u3044<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"1313\" data-end=\"1336\">Euler Angles\uff08\u30aa\u30a4\u30e9\u30fc\u89d2\uff09<\/h5>\n<ul data-start=\"1337\" data-end=\"1383\">\n<li data-start=\"1337\" data-end=\"1352\">\n<p data-start=\"1339\" data-end=\"1352\">XYZ\u8ef8\u306e\u56de\u8ee2\u3092\u9806\u756a\u306b\u9069\u7528<\/p>\n<\/li>\n<li data-start=\"1353\" data-end=\"1364\">\n<p data-start=\"1355\" data-end=\"1364\">\u4eba\u9593\u306b\u5206\u304b\u308a\u3084\u3059\u3044<\/p>\n<\/li>\n<li data-start=\"1365\" data-end=\"1383\">\n<p data-start=\"1367\" data-end=\"1383\">\u30b8\u30f3\u30d0\u30eb\u30ed\u30c3\u30af\u306e\u5f71\u97ff\u3092\u53d7\u3051\u3084\u3059\u3044<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"1390\" data-end=\"1411\">Matrices\uff08\u884c\u5217\u306b\u3088\u308b\u56de\u8ee2\uff09<\/h5>\n<ul data-start=\"1412\" data-end=\"1457\">\n<li data-start=\"1412\" data-end=\"1420\">\n<p data-start=\"1414\" data-end=\"1420\">\u5b89\u5b9a\u3057\u3066\u3044\u308b<\/p>\n<\/li>\n<li data-start=\"1421\" data-end=\"1442\">\n<p data-start=\"1423\" data-end=\"1442\">\u4ed6\u306e\u5909\u63db\uff08\u79fb\u52d5\u30fb\u62e1\u7e2e\uff09\u3068\u307e\u3068\u3081\u3066\u6271\u3048\u308b<\/p>\n<\/li>\n<li data-start=\"1443\" data-end=\"1457\">\n<p data-start=\"1445\" data-end=\"1457\">\u76f4\u611f\u7684\u306a\u7de8\u96c6\u306f\u3084\u3084\u96e3\u3057\u3044<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"1464\" data-end=\"1488\">Quaternions\uff08\u30af\u30a9\u30fc\u30bf\u30cb\u30aa\u30f3\uff09<\/h5>\n<ul data-start=\"1489\" data-end=\"1593\">\n<li data-start=\"1489\" data-end=\"1525\">\n<p data-start=\"1491\" data-end=\"1525\">\u69cb\u6210\uff1a1\u3064\u306e\u30b9\u30ab\u30e9\u30fc\u5024 + 3\u3064\u306e\u865a\u6570\u6210\u5206\uff08x, y, z\uff09<\/p>\n<\/li>\n<li data-start=\"1526\" data-end=\"1540\">\n<p data-start=\"1528\" data-end=\"1540\">\u30b8\u30f3\u30d0\u30eb\u30ed\u30c3\u30af\u304c\u8d77\u304d\u306a\u3044<\/p>\n<\/li>\n<li data-start=\"1541\" data-end=\"1559\">\n<p data-start=\"1543\" data-end=\"1559\">\u56de\u8ee2\u306e\u88dc\u9593\uff08Slerp\uff09\u304c\u6ed1\u3089\u304b<\/p>\n<\/li>\n<li data-start=\"1560\" data-end=\"1593\">\n<p data-start=\"1562\" data-end=\"1593\">\u6570\u5f0f\u306f\u8907\u96d1\u3060\u304c\u3001\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\u5074\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u591a\u3044<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"1595\" data-end=\"1602\">\u6d3b\u7528\u4f8b<\/h5>\n<ul data-start=\"1603\" data-end=\"1650\">\n<li data-start=\"1603\" data-end=\"1620\">\n<p data-start=\"1605\" data-end=\"1620\">3D\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u3084\u30ab\u30e1\u30e9\u306e\u56de\u8ee2<\/p>\n<\/li>\n<li data-start=\"1621\" data-end=\"1632\">\n<p data-start=\"1623\" data-end=\"1632\">\u306a\u3081\u3089\u304b\u306a\u65b9\u5411\u8ee2\u63db<\/p>\n<\/li>\n<li data-start=\"1633\" data-end=\"1650\">\n<p data-start=\"1635\" data-end=\"1650\">\u7269\u7406\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u56de\u8ee2\u5236\u5fa1<\/p>\n<\/li>\n<\/ul>\n<h4 data-start=\"1657\" data-end=\"1663\">\u307e\u3068\u3081<\/h4>\n<ul data-start=\"1665\" data-end=\"1778\">\n<li data-start=\"1665\" data-end=\"1692\">\n<p data-start=\"1667\" data-end=\"1692\"><strong data-start=\"1667\" data-end=\"1675\">\u7dda\u5f62\u88dc\u9593<\/strong>\uff1a\u6570\u5024\u3084\u4f4d\u7f6e\u3092\u30b9\u30e0\u30fc\u30ba\u306b\u5909\u5316\u3055\u305b\u308b<\/p>\n<\/li>\n<li data-start=\"1693\" data-end=\"1715\">\n<p data-start=\"1695\" data-end=\"1715\"><strong data-start=\"1695\" data-end=\"1703\">\u4e09\u89d2\u95a2\u6570<\/strong>\uff1a\u89d2\u5ea6\u30fb\u65b9\u5411\u30fb\u8ddd\u96e2\u306e\u8a08\u7b97<\/p>\n<\/li>\n<li data-start=\"1716\" data-end=\"1740\">\n<p data-start=\"1718\" data-end=\"1740\"><strong data-start=\"1718\" data-end=\"1724\">\u884c\u5217<\/strong>\uff1a\u79fb\u52d5\u30fb\u56de\u8ee2\u30fb\u62e1\u7e2e\u3092\u307e\u3068\u3081\u3066\u51e6\u7406<\/p>\n<\/li>\n<li data-start=\"1741\" data-end=\"1778\">\n<p data-start=\"1743\" data-end=\"1778\"><strong data-start=\"1743\" data-end=\"1752\">\u56de\u8ee2\u306e\u8868\u73fe<\/strong>\uff1aEuler\u89d2\u30fb\u884c\u5217\u30fb\u30af\u30a9\u30fc\u30bf\u30cb\u30aa\u30f3\u306e\u4f7f\u3044\u5206\u3051\u304c\u91cd\u8981<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"1780\" data-end=\"1867\">\u30b2\u30fc\u30e0\u958b\u767a\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6570\u5b66\u304c\u7d44\u307f\u5408\u308f\u3055\u3063\u3066<strong data-start=\"1802\" data-end=\"1815\">\u81ea\u7136\u3067\u9b45\u529b\u7684\u306a\u52d5\u304d<\/strong>\u3092\u4f5c\u308a\u51fa\u3057\u307e\u3059\u3002<br data-start=\"1823\" data-end=\"1826\" \/>\u305d\u308c\u3067\u306f\u3001\u3053\u308c\u3089\u3092Rust\u3067\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-start=\"1780\" data-end=\"1867\">\u00a0<\/p>\n<h4 data-start=\"174\" data-end=\"190\">\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\uff08Cargo\uff09<\/h4>\n<div class=\"contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary\">\n<div class=\"flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary select-none rounded-t-2xl\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># Cargo.toml\n[package]\nname = \"game-math-basics\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nglam = \"0.29\"\n<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<\/div>\n<div class=\"relative flex basis-auto flex-col -mb-(--composer-overlap-px) [--composer-overlap-px:28px] grow overflow-hidden\">\n<div class=\"relative h-full\">\n<div class=\"flex h-full flex-col overflow-y-auto [scrollbar-gutter:stable_both-edges] @[84rem]\/thread:pt-(--header-height)\">\n<div class=\"@thread-xl\/thread:pt-header-height flex flex-col text-sm pb-25\">\n<article class=\"text-token-text-primary w-full focus:outline-none scroll-mt-[calc(var(--header-height)+min(200px,max(70px,20svh)))]\" dir=\"auto\" tabindex=\"-1\" data-turn-id=\"04d3fb47-ef52-401f-9eb8-100235516898\" data-testid=\"conversation-turn-4\" data-scroll-anchor=\"true\" data-turn=\"assistant\">\n<div class=\"text-base my-auto mx-auto pb-10 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1 group\/turn-messages focus-visible:outline-hidden relative flex w-full min-w-0 flex-col agent-turn\" tabindex=\"-1\">\n<div class=\"flex max-w-full flex-col grow\">\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"82ab34a7-ec32-40cc-85ae-ca2e16b6a3dc\" data-message-model-slug=\"gpt-5-thinking\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<h4 data-start=\"324\" data-end=\"340\">1) \u7dda\u5f62\u88dc\u9593\uff08Lerp\uff09<\/h4>\n<h5 data-start=\"342\" data-end=\"356\">\u7d20\u306e Rust \u5b9f\u88c5<\/h5>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">pub fn lerp(a: f32, b: f32, t: f32) -&gt; f32 {\n    a + (b - a) * t\n}\n\n#[test]\nfn test_lerp() {\n    assert!((lerp(0.0, 10.0, 0.25) - 2.5).abs() &lt; 1e-6);\n}\n<br \/><br \/><\/pre>\n<h5 data-start=\"522\" data-end=\"545\">glam \u3067\u306e\u5229\u7528\u4f8b\uff08\u8272\u3084\u4f4d\u7f6e\u306e\u88dc\u9593\uff09<\/h5>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Vec3, Vec4};\n\nfn lerp_vec3(a: Vec3, b: Vec3, t: f32) -&gt; Vec3 {\n    a + (b - a) * t\n}\n\nfn main() {\n    let p0 = Vec3::new(0.0, 0.0, 0.0);\n    let p1 = Vec3::new(10.0, 5.0, 0.0);\n    let p = lerp_vec3(p0, p1, 0.3);\n    println!(\"Position: {p:?}\"); \/\/ (3.0, 1.5, 0.0)\n\n    let c0 = Vec4::new(0.0, 0.0, 0.0, 1.0); \/\/ \u9ed2\n    let c1 = Vec4::new(1.0, 1.0, 1.0, 1.0); \/\/ \u767d\n    let c  = c0.lerp(c1, 0.5);\n    println!(\"Color: {c:?}\"); \/\/ (0.5, 0.5, 0.5, 1.0)\n}\n<\/pre>\n<p>\u00a0<\/p>\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<h4 data-start=\"1026\" data-end=\"1054\">2) \u4e09\u89d2\u95a2\u6570\uff08Angles \/ Vectors\uff09<\/h4>\n<h5 data-start=\"1056\" data-end=\"1070\">\u89d2\u5ea6\uff08\u5ea6&#x2194;\u30e9\u30b8\u30a2\u30f3\uff09<\/h5>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">pub fn deg2rad(deg: f32) -&gt; f32 { deg.to_radians() }\npub fn rad2deg(rad: f32) -&gt; f32 { rad.to_degrees() }\n\nfn main() {\n    println!(\"180\u00b0 = {} rad\", deg2rad(180.0));\n    println!(\"\u03c0   = {} \u00b0\", rad2deg(std::f32::consts::PI));\n}\n<\/pre>\n<p>\u00a0<\/p>\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<h5 data-start=\"1311\" data-end=\"1336\">\u30d9\u30af\u30c8\u30eb\u306e\u57fa\u672c\uff08\u6b63\u898f\u5316\u30fb\u5185\u7a4d\u30fb\u5916\u7a4d\u30fb\u5c04\u5f71\uff09<\/h5>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">use glam::Vec3;\n\nfn main() {\n    let v = Vec3::new(3.0, 4.0, 0.0);\n    let n = v.normalize();\n    println!(\"len={} -&gt; normalize={:?}\", v.length(), n); \/\/ len=5 \u2192 (0.6, 0.8, 0)\n\n    let a = Vec3::new(1.0, 0.0, 0.0);\n    let b = Vec3::new(0.0, 1.0, 0.0);\n    println!(\"dot(a,b)={}\", a.dot(b)); \/\/ 0\uff08\u76f4\u4ea4\uff09\n    println!(\"cross(a,b)={:?}\", a.cross(b)); \/\/ (0,0,1)\n\n    \/\/ a \u65b9\u5411\u3078\u306e b \u306e\u5c04\u5f71\n    let proj = a * (b.dot(a) \/ a.length_squared());\n    println!(\"projection of b on a = {:?}\", proj); \/\/ (0,0,0)\n}\n<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<p data-start=\"1844\" data-end=\"1850\">\u3088\u304f\u3042\u308b\u7528\u9014<\/p>\n<ul data-start=\"1851\" data-end=\"1923\">\n<li data-start=\"1851\" data-end=\"1891\">\n<p data-start=\"1853\" data-end=\"1891\">\u89d2\u5ea6\u306e\u8a08\u7b97\uff1a<code data-start=\"1859\" data-end=\"1882\">cos\u03b8 = a\u00b7b \/ (|a||b|)<\/code> \u2192 \u65b9\u5411\u306e\u985e\u4f3c\u5ea6<\/p>\n<\/li>\n<li data-start=\"1892\" data-end=\"1923\">\n<p data-start=\"1894\" data-end=\"1923\">2D\/3D \u306e\u5411\u304d\u64cd\u4f5c\u3001\u8996\u7dda\u30d9\u30af\u30c8\u30eb\u3001\u79fb\u52d5\u5165\u529b\u306e\u6b63\u898f\u5316\u306a\u3069<\/p>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<\/div>\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<h4 data-start=\"1930\" data-end=\"1948\">3) \u884c\u5217\uff08Matrices\uff09<\/h4>\n<h5 data-start=\"1950\" data-end=\"1970\">2D\uff1a\u5e73\u884c\u79fb\u52d5\uff0b\u56de\u8ee2\uff0b\u62e1\u7e2e\u306e\u5408\u6210<\/h5>\n<div class=\"contain-inline-size rounded-2xl relative bg-token-sidebar-surface-primary\">\n<div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Mat3, Vec2};\n\nfn main() {\n    let translation = Mat3::from_translation(Vec2::new(100.0, 50.0));\n    let rotation    = Mat3::from_angle(std::f32::consts::FRAC_PI_4); \/\/ 45\u00b0\n    let scale       = Mat3::from_scale(Vec2::new(2.0, 1.5));\n\n    \/\/ \u6ce8\u610f\uff1a\u9069\u7528\u9806\u3092\u610f\u8b58\uff08\u53f3\u304b\u3089\u5de6\u3078\u9069\u7528\u3055\u308c\u308b\uff09\n    let model = translation * rotation * scale;\n\n    let p_local = Vec2::new(1.0, 0.0);\n    let p_world = model.transform_point2(p_local);\n    println!(\"2D transformed = {:?}\", p_world);\n}\n<\/pre>\n<\/div>\n<\/div>\n<h5 data-start=\"2447\" data-end=\"2476\">\u00a0<\/h5>\n<h5 data-start=\"2447\" data-end=\"2476\">3D\uff1a\u30ed\u30fc\u30ab\u30eb\u2192\u30ef\u30fc\u30eb\u30c9\u3001\u30d3\u30e5\u30fc\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30b7\u30e7\u30f3<\/h5>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Mat4, Vec3, Quat};\n\nfn main() {\n    \/\/ \u30e2\u30c7\u30eb\u884c\u5217\uff08\u5e73\u884c\u79fb\u52d5\u00d7\u56de\u8ee2\u00d7\u62e1\u7e2e\uff09\n    let t = Mat4::from_translation(Vec3::new(0.0, 1.0, 5.0));\n    let r = Mat4::from_quat(Quat::from_rotation_y(std::f32::consts::PI * 0.25)); \/\/ Y\u8ef845\u00b0\n    let s = Mat4::from_scale(Vec3::splat(2.0));\n    let model = t * r * s;\n\n    \/\/ \u30d3\u30e5\u30fc\u884c\u5217\uff08\u30ab\u30e1\u30e9\uff09\n    let eye    = Vec3::new(0.0, 2.0, 8.0);\n    let target = Vec3::ZERO;\n    let up     = Vec3::Y;\n    let view   = Mat4::look_at_rh(eye, target, up);\n\n    \/\/ \u900f\u8996\u6295\u5f71\n    let proj = Mat4::perspective_rh_gl(45f32.to_radians(), 16.0\/9.0, 0.1, 1000.0);\n\n    \/\/ \u6700\u7d42\u30af\u30ea\u30c3\u30d7\u7a7a\u9593\n    let mvp = proj * view * model;\n    println!(\"MVP=\\n{mvp:?}\");\n}\n<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<h4 data-start=\"3140\" data-end=\"3159\">4) \u56de\u8ee2\uff08Rotations\uff09<\/h4>\n<h5 data-start=\"3161\" data-end=\"3174\">\u30b8\u30f3\u30d0\u30eb\u30ed\u30c3\u30af\u3068\u306f<\/h5>\n<ul data-start=\"3175\" data-end=\"3280\">\n<li data-start=\"3175\" data-end=\"3249\">\n<p data-start=\"3177\" data-end=\"3249\">XYZ \u306e <strong data-start=\"3183\" data-end=\"3192\">\u30aa\u30a4\u30e9\u30fc\u89d2<\/strong>\u3067\u56de\u8ee2\u3092\u9806\u306b\u639b\u3051\u308b\u3068\u3001\u7279\u5b9a\u306e\u59ff\u52e2\uff08\u4f8b\uff1a\u30d4\u30c3\u30c1=\u00b190\u00b0\uff09\u3067 2 \u8ef8\u304c\u91cd\u306a\u308a\u3001\u81ea\u7531\u5ea6\u304c 3\u21922 \u306b\u843d\u3061\u3066\u3057\u307e\u3046\u73fe\u8c61\u3002<\/p>\n<\/li>\n<li data-start=\"3250\" data-end=\"3280\">\n<p data-start=\"3252\" data-end=\"3280\">\u30ab\u30e1\u30e9\u3084\u30ad\u30e3\u30e9\u306e\u6025\u306a\u306d\u3058\u308c\u3001\u610f\u56f3\u3057\u306a\u3044\u56de\u8ee2\u5236\u9650\u306e\u539f\u56e0\u306b\u3002<\/p>\n<\/li>\n<\/ul>\n<h5 data-start=\"3282\" data-end=\"3305\">\u30aa\u30a4\u30e9\u30fc\u89d2\uff08Euler Angles\uff09<\/h5>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Mat3, Vec3};\n\nfn euler_xyz_to_mat3(euler_deg: Vec3) -&gt; Mat3 {\n    let (rx, ry, rz) = (\n        euler_deg.x.to_radians(),\n        euler_deg.y.to_radians(),\n        euler_deg.z.to_radians(),\n    );\n    let rxm = Mat3::from_rotation_x(rx);\n    let rym = Mat3::from_rotation_y(ry);\n    let rzm = Mat3::from_rotation_z(rz);\n    \/\/ XYZ \u306e\u9806\u3067\u9069\u7528\n    rzm * rym * rxm\n}\n\nfn main() {\n    let m = euler_xyz_to_mat3(Vec3::new(90.0, 0.0, 0.0)); \/\/ \u30d4\u30c3\u30c190\u00b0\n    println!(\"{m:?}\");\n}\n<\/pre>\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<blockquote data-start=\"3794\" data-end=\"3858\">\n<p data-start=\"3796\" data-end=\"3858\">\u5b9f\u904b\u7528\u3067\u306f\u3001<strong data-start=\"3802\" data-end=\"3818\">\u5185\u90e8\u8868\u73fe\u306f\u30af\u30a9\u30fc\u30bf\u30cb\u30aa\u30f3<\/strong>\u3001UI \u5165\u529b\u306f\u30aa\u30a4\u30e9\u30fc\u89d2\u3067\u53d7\u3051\u308b\uff08\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u5909\u63db\uff09\u3068\u3044\u3046\u69cb\u6210\u304c\u6271\u3044\u3084\u3059\u3044\u3067\u3059\u3002<\/p>\n<\/blockquote>\n<h5 data-start=\"3860\" data-end=\"3870\">\u884c\u5217\u3067\u306e\u56de\u8ee2<\/h5>\n<ul data-start=\"3871\" data-end=\"3923\">\n<li data-start=\"3871\" data-end=\"3892\">\n<p data-start=\"3873\" data-end=\"3892\">\u5909\u63db\u306e\u5408\u6210\uff08\u62e1\u7e2e\u30fb\u79fb\u52d5\uff09\u3068\u4e00\u7dd2\u306b\u6271\u3048\u308b<\/p>\n<\/li>\n<li data-start=\"3893\" data-end=\"3923\">\n<p data-start=\"3895\" data-end=\"3923\">\u6570\u5024\u8aa4\u5dee\u306e\u84c4\u7a4d\u56de\u907f\u306b\u306f\u6b63\u898f\u76f4\u4ea4\u5316\uff08\u518d\u76f4\u4ea4\u5316\uff09\u3092\u631f\u3080\u3053\u3068\u3082<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Mat3, Vec3};\nfn rotate_vec(m: Mat3, v: Vec3) -&gt; Vec3 { m * v }<\/pre>\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<h5 data-start=\"4012\" data-end=\"4036\">\u30af\u30a9\u30fc\u30bf\u30cb\u30aa\u30f3\uff08Quaternions\uff09<\/h5>\n<ul data-start=\"4038\" data-end=\"4130\">\n<li data-start=\"4038\" data-end=\"4067\">\n<p data-start=\"4040\" data-end=\"4067\">\u69cb\u6210\uff1a<code data-start=\"4043\" data-end=\"4046\">w<\/code>\uff08\u30b9\u30ab\u30e9\u30fc\uff09\uff0b <code data-start=\"4054\" data-end=\"4061\">x,y,z<\/code>\uff08\u865a\u6570\u6210\u5206\uff09<\/p>\n<\/li>\n<li data-start=\"4068\" data-end=\"4104\">\n<p data-start=\"4070\" data-end=\"4104\"><strong data-start=\"4070\" data-end=\"4084\">\u30b8\u30f3\u30d0\u30eb\u30ed\u30c3\u30af\u3092\u56de\u907f<\/strong>\u3001\u56de\u8ee2\u88dc\u9593\uff08<strong data-start=\"4090\" data-end=\"4099\">Slerp<\/strong>\uff09\u304c\u6ed1\u3089\u304b<\/p>\n<\/li>\n<li data-start=\"4105\" data-end=\"4130\">\n<p data-start=\"4107\" data-end=\"4130\">\u30b2\u30fc\u30e0\u30a8\u30f3\u30b8\u30f3\/\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u306e\u6a19\u6e96\u7684\u306a\u56de\u8ee2\u8868\u73fe<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Quat, Vec3, Mat3, Mat4};\n\nfn main() {\n    \/\/ 1) \u8ef8\u3068\u89d2\u5ea6\u304b\u3089\u4f5c\u308b\n    let axis = Vec3::Y; \/\/ Y \u8ef8\n    let angle = 45f32.to_radians();\n    let q = Quat::from_axis_angle(axis, angle);\n\n    \/\/ 2) \u30aa\u30a4\u30e9\u30fc\u89d2\u304b\u3089\u4f5c\u308b\uff08\u9806\u5e8f\u306b\u6ce8\u610f\uff09\n    let q_euler = Quat::from_euler(glam::EulerRot::XYZ, 0.0, angle, 0.0);\n\n    \/\/ 3) \u30d9\u30af\u30c8\u30eb\u3092\u56de\u3059\n    let v = Vec3::X;\n    let v_rot = q * v; \/\/ Quat * Vec3 \u3067\u56de\u8ee2\n    println!(\"rotated vec = {:?}\", v_rot);\n\n    \/\/ 4) \u884c\u5217\u3078\u5909\u63db\uff08\u5fc5\u8981\u306b\u5fdc\u3058\u3066\uff09\n    let rot3: Mat3 = Mat3::from_quat(q);\n    let rot4: Mat4 = Mat4::from_quat(q);\n    println!(\"Mat3 = {rot3:?}, Mat4 = {rot4:?}\");\n}\n<\/pre>\n<p class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\"><strong>Slerp\uff08\u7403\u9762\u7dda\u5f62\u88dc\u9593\uff09\u3067\u6ed1\u3089\u304b\u306a\u56de\u8ee2<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Quat, Vec3};\n\nfn main() {\n    let q0 = Quat::from_axis_angle(Vec3::Y, 0.0);\n    let q1 = Quat::from_axis_angle(Vec3::Y, 180f32.to_radians());\n\n    for i in 0..=5 {\n        let t = i as f32 \/ 5.0;\n        let q = q0.slerp(q1, t);\n        let forward = q * Vec3::Z; \/\/ \u524d\u65b9\u5411\u30d9\u30af\u30c8\u30eb\n        println!(\"t={t:.2} forward={forward:?}\");\n    }\n}\n<\/pre>\n<\/div>\n<p data-enlighter-language=\"rust\"><strong><span style=\"color: revert; font-size: revert; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\">Look Rotation\uff08\u65b9\u5411\u30d9\u30af\u30c8\u30eb\u304b\u3089\u56de\u8ee2\u3092\u4f5c\u308b\uff09<\/span><\/strong><\/p>\n<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">use glam::{Quat, Vec3};\n\n\/\/\/ forward \u3068 up \u304b\u3089\u3001\u59ff\u52e2\uff08\u30af\u30a9\u30fc\u30bf\u30cb\u30aa\u30f3\uff09\u3092\u69cb\u7bc9\nfn look_rotation(forward: Vec3, up: Vec3) -&gt; Quat {\n    Quat::from_mat3(&amp;glam::Mat3::look_to_rh(Vec3::ZERO, forward.normalize(), up.normalize()))\n}\n\nfn main() {\n    let target_dir = Vec3::new(1.0, 0.5, 0.0);\n    let q = look_rotation(target_dir, Vec3::Y);\n    println!(\"look quat = {q:?}\");\n}\n<\/pre>\n<p>\u00a0<\/p>\n<h4><span style=\"color: revert; font-size: revert; font-weight: revert; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\">\u307e\u3068\u3081\uff08\u4f7f\u3044\u5206\u3051\u306e\u6307\u91dd\uff09<\/span><\/h4>\n<div class=\"min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&amp;]:mt-5\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"82ab34a7-ec32-40cc-85ae-ca2e16b6a3dc\" data-message-model-slug=\"gpt-5-thinking\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose dark:prose-invert w-full break-words light markdown-new-styling\">\n<ul data-start=\"5519\" data-end=\"5742\">\n<li data-start=\"5519\" data-end=\"5561\">\n<p data-start=\"5521\" data-end=\"5561\"><strong data-start=\"5521\" data-end=\"5529\">Lerp<\/strong>\uff1a\u6570\u5024\u3084\u4f4d\u7f6e\u30fb\u8272\u306e\u6ed1\u3089\u304b\u306a\u9077\u79fb\u306b\uff080..1 \u306e <code data-start=\"5553\" data-end=\"5556\">t<\/code> \u3092\u5236\u5fa1\uff09<\/p>\n<\/li>\n<li data-start=\"5562\" data-end=\"5593\">\n<p data-start=\"5564\" data-end=\"5593\"><strong data-start=\"5564\" data-end=\"5577\">\u4e09\u89d2\u95a2\u6570\/\u30d9\u30af\u30c8\u30eb<\/strong>\uff1a\u89d2\u5ea6\u30fb\u65b9\u5411\u30fb\u5c04\u5f71\u30fb\u6b63\u898f\u5316\u306f\u983b\u51fa<\/p>\n<\/li>\n<li data-start=\"5594\" data-end=\"5627\">\n<p data-start=\"5596\" data-end=\"5627\"><strong data-start=\"5596\" data-end=\"5602\">\u884c\u5217<\/strong>\uff1a\u79fb\u52d5\u30fb\u56de\u8ee2\u30fb\u62e1\u7e2e\u306e\u5408\u6210\u3001\u5ea7\u6a19\u7a7a\u9593\u306e\u5909\u63db\uff08MVP\uff09<\/p>\n<\/li>\n<li data-start=\"5628\" data-end=\"5742\">\n<p data-start=\"5630\" data-end=\"5640\"><strong data-start=\"5630\" data-end=\"5638\">\u56de\u8ee2\u8868\u73fe<\/strong><\/p>\n<ul data-start=\"5643\" data-end=\"5742\">\n<li data-start=\"5643\" data-end=\"5670\">\n<p data-start=\"5645\" data-end=\"5670\">\u5165\u529b\/UI\uff1a<strong data-start=\"5651\" data-end=\"5660\">\u30aa\u30a4\u30e9\u30fc\u89d2<\/strong>\uff08\u308f\u304b\u308a\u3084\u3059\u3044\uff09<\/p>\n<\/li>\n<li data-start=\"5673\" data-end=\"5711\">\n<p data-start=\"5675\" data-end=\"5711\">\u5185\u90e8\/\u6f14\u7b97\uff1a<strong data-start=\"5681\" data-end=\"5692\">\u30af\u30a9\u30fc\u30bf\u30cb\u30aa\u30f3<\/strong>\uff08\u30b8\u30f3\u30d0\u30eb\u30ed\u30c3\u30af\u56de\u907f\u3001\u88dc\u9593\u304c\u5f37\u3044\uff09<\/p>\n<\/li>\n<li data-start=\"5714\" data-end=\"5742\">\n<p data-start=\"5716\" data-end=\"5742\">\u5909\u63db\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\uff1a<strong data-start=\"5725\" data-end=\"5731\">\u884c\u5217<\/strong>\uff08\u6700\u7d42\u7684\u306a\u5408\u6210\u306b\u4fbf\u5229\uff09<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 data-start=\"5749\" data-end=\"5770\">\u00a0<\/h2>\n<h4 data-start=\"5749\" data-end=\"5770\">\u304a\u307e\u3051\uff1a\u6700\u5c0f\u30c7\u30e2\uff081\u30d5\u30a1\u30a4\u30eb\u306b\u96c6\u7d04\uff09<\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\">\/\/ src\/main.rs\nuse glam::{Vec2, Vec3, Vec4, Mat3, Mat4, Quat};\n\nfn lerp(a: f32, b: f32, t: f32) -&gt; f32 { a + (b - a) * t }\n\nfn main() {\n    \/\/ --- Lerp\n    println!(\"lerp(0, 10, 0.3) = {}\", lerp(0.0, 10.0, 0.3));\n\n    \/\/ --- Angles\n    println!(\"90\u00b0 = {} rad\", 90f32.to_radians());\n\n    \/\/ --- Vectors\n    let v = Vec3::new(3.0, 4.0, 0.0);\n    println!(\"len={}, norm={:?}\", v.length(), v.normalize());\n    println!(\"dot(X, Y)={}\", Vec3::X.dot(Vec3::Y));\n    println!(\"cross(X, Y)={:?}\", Vec3::X.cross(Vec3::Y));\n\n    \/\/ --- Matrices (2D)\n    let m2 = Mat3::from_translation(Vec2::new(100.0, 50.0))\n        * Mat3::from_angle(std::f32::consts::FRAC_PI_4)\n        * Mat3::from_scale(Vec2::new(2.0, 1.5));\n    println!(\"2D point -&gt; {:?}\", m2.transform_point2(Vec2::new(1.0, 0.0)));\n\n    \/\/ --- Matrices (3D)\n    let model = Mat4::from_translation(Vec3::new(0.0, 1.0, 5.0))\n        * Mat4::from_quat(Quat::from_rotation_y(std::f32::consts::PI * 0.25))\n        * Mat4::from_scale(Vec3::splat(2.0));\n    let view  = Mat4::look_at_rh(Vec3::new(0.0, 2.0, 8.0), Vec3::ZERO, Vec3::Y);\n    let proj  = Mat4::perspective_rh_gl(45f32.to_radians(), 16.0\/9.0, 0.1, 1000.0);\n    let _mvp  = proj * view * model;\n\n    \/\/ --- Quaternions\n    let q0 = Quat::from_axis_angle(Vec3::Y, 0.0);\n    let q1 = Quat::from_axis_angle(Vec3::Y, std::f32::consts::PI);\n    let mid = q0.slerp(q1, 0.5);\n    let forward = mid * Vec3::Z;\n    println!(\"slerp forward = {:?}\", forward);\n\n    \/\/ --- Color lerp\n    let c0 = Vec4::new(0.0, 0.0, 0.0, 1.0);\n    let c1 = Vec4::new(1.0, 1.0, 1.0, 1.0);\n    println!(\"color = {:?}\", c0.lerp(c1, 0.25));\n}\n<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/article>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"thread-bottom-container\" class=\"relative isolate z-10 w-full basis-auto has-data-has-thread-error:pt-2 has-data-has-thread-error:[box-shadow:var(--sharp-edge-bottom-shadow)] md:border-transparent md:pt-0 dark:border-white\/20 md:dark:border-transparent content-fade single-line flex flex-col\">\n<div id=\"thread-bottom\">\n<div class=\"text-base mx-auto [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)\">\n<div class=\"[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto max-w-(--thread-content-max-width) flex-1\">\n<div class=\"max-xs:[--force-hide-label:none] relative z-1 flex h-full max-w-full flex-1 flex-col\"><form class=\"w-full [view-transition-name:var(--vt-composer)]\" data-type=\"unified-composer\">\n<div class=\"bg-token-bg-primary shadow-short flex w-full cursor-text flex-col items-center justify-center overflow-clip bg-clip-padding contain-inline-size dark:bg-[#303030] rounded-[28px]\">\n<div class=\"relative flex min-h-14 w-full items-end\">\n<div class=\"relative flex w-full flex-auto flex-col\">\n<div class=\"relative mx-5 flex min-h-14 flex-auto bg-transparent items-start\">\n<div class=\"_prosemirror-parent_ebv8s_2 text-token-text-primary max-h-[max(35svh,5rem)] max-h-52 flex-1 overflow-auto [scrollbar-width:thin] default-browser vertical-scroll-fade-mask\">\u3068\u3044\u3046\u306e\u3082\u3001ChatGPT\u304c\u4e00\u77ac\u3067\u5410\u304d\u51fa\u305b\u308b\u4e16\u306e\u4e2d\u306b\u306a\u3063\u305f\u308f\u3051\u3060\u3002<\/div>\n<\/div>\n<div>\u00a0<\/div>\n<div class=\"relative mx-5 flex min-h-14 flex-auto bg-transparent items-start\">\n<div class=\"_prosemirror-parent_ebv8s_2 text-token-text-primary max-h-[max(35svh,5rem)] max-h-52 flex-1 overflow-auto [scrollbar-width:thin] default-browser vertical-scroll-fade-mask\">\u753b\u50cf\u3082\u542b\u3081\uff08\u884c\u5217\u304a\u304b\u3057\u304f\u306a\u3044\uff1f\uff09\u3002\u975e\u5e38\u306b\u4fbf\u5229\u3060\u304c\u3001\u672b\u6050\u308d\u3057\u3044\u4e16\u306e\u4e2d\u306b\u306a\u3063\u305f\u3082\u3093\u3060\u3002<\/div>\n<div>\u305d\u3046\u601d\u3063\u305f\u4eca\u65e5\u3053\u306e\u3054\u308d\u3067\u3057\u305f\u3002<\/div>\n<\/div>\n<div class=\"relative mx-5 flex min-h-14 flex-auto bg-transparent items-start\">\n<div>\u00a0<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/form><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u3069\u3082\u3067\u3059\u3002 \u30b2\u30fc\u30e0\u958b\u767a\u3067\u306f\u3001\u898b\u305f\u76ee\u306e\u6d3e\u624b\u3055\u3084\u30b9\u30c8\u30fc\u30ea\u30fc\u3082\u5927\u4e8b\u3067\u3059\u304c\u3001\u88cf\u5074\u3067\u306f\u6570\u5b66\u304c\u591a\u304f\u306e\u8868\u73fe\u3084\u6319\u52d5\u3092\u652f\u3048\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001\u7279\u306b\u30b2\u30fc\u30e0\u306e\u57fa\u790e\u3092\u5f62\u4f5c\u308b\u300c\u7dda\u5f62\u88dc\u9593\u300d\u300c\u4e09\u89d2\u95a2\u6570\u300d\u300c\u884c\u5217\u300d\u300c\u56de\u8ee2\u300d\u306e\u57fa\u672c\u3068\u6d3b\u7528\u3092\u307e\u3068\u3081\u307e\u3059\u3002  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":12323,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[299],"tags":[109,364,370,78,374],"class_list":["post-12316","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rust","tag-109","tag-ai","tag-370","tag-78","tag-374"],"_links":{"self":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts\/12316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12316"}],"version-history":[{"count":4,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts\/12316\/revisions"}],"predecessor-version":[{"id":12322,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/posts\/12316\/revisions\/12322"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=\/wp\/v2\/media\/12323"}],"wp:attachment":[{"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcyou.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}