mirror of
https://github.com/godotengine/godot-website.git
synced 2026-01-04 06:09:55 +03:00
Deploying to published from @ godotengine/godot-website@f48343bb18 🚀
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -6,7 +6,7 @@
|
||||
<a href=/priorities/>Priorities</a></div><div class=nav-dropdown-menu id=community-dropdown><a href=/community/ class=touch-only>Community</a>
|
||||
<a href=https://forum.godotengine.org>Forum</a>
|
||||
<a href=/events/>Events</a></div><script>document.addEventListener("DOMContentLoaded",function(){const e=document.querySelectorAll("[data-dropdown]");e.forEach(e=>{const n=e.getAttribute("data-dropdown"),t=document.getElementById(n);if(t){let n=-1;const i=()=>{if(n===-1)return;clearTimeout(n),n=-1},a=()=>t.style.display==="block",r=()=>{if(a())return;if(window.innerWidth<1200)return;i();const n=e.getBoundingClientRect();t.style.top=n.bottom+"px",t.style.left=n.left+"px",t.style.display="block",e.classList.add("dropdown-open")},s=({instant:s=!1}={})=>{if(!a())return;const o=()=>{i(),t.style.display="none",e.classList.remove("dropdown-open")};if(s){o();return}n=setTimeout(o,100)},l=e=>{if(window.innerWidth<1200)return;e.preventDefault(),a()?s({instant:!0}):r()},c=e=>t=>{t.pointerType==="touch"&&e(t)},o=e=>t=>{t.pointerType!=="touch"&&e(t)};e.addEventListener("pointerup",c(e=>l(e))),document.documentElement.addEventListener("pointerup",c(n=>{!e.contains(n.target)&&!t.contains(n.target)&&s({instant:!0})})),e.addEventListener("pointerenter",o(e=>r())),e.addEventListener("pointerleave",o(e=>s())),t.addEventListener("pointerenter",o(e=>i())),t.addEventListener("pointerleave",o(e=>s()))}})})</script><main><style>body{background-color:var(--background-color)}h1{margin-bottom:8px;margin-top:32px}:not(pre)>code{background:var(--code-background-color);padding:1px 4px;font-size:.95em;border-radius:3px}pre{background:var(--codeblock-background-color);color:var(--codeblock-color)}pre code{display:block;overflow-x:auto;padding:.5em}.date-big{line-height:2;margin-left:32px}article{background-color:var(--base-color);box-shadow:0 3px 2px rgba(0,0,0,.15)}figure{margin:0}figure img{margin:0}article img,article video{max-width:100%;height:auto;display:block;margin:auto;margin-top:16px;margin-bottom:16px}article h1{margin-top:64px}article h2,article h3,article h4{margin-top:42px}.article-info{display:flex;flex-direction:column;gap:8px}.article-metadata{display:flex;gap:24px;align-items:center;font-family:var(--header-font-family);margin-bottom:12px}@media(max-width:900px){.article-metadata{flex-direction:column;align-items:flex-start;gap:16px}}.article-author{color:var(--base-color-text-subtitle-date);font-weight:700;font-size:18px;flex-grow:1;display:flex;gap:12px;align-items:center}.article-author .avatar{border-radius:100%;margin:0;background:0 0}.article-author .by{color:var(--base-color-text-subtitle)}.article-metadata .date{color:var(--base-color-text-subtitle-date)}.article-metadata .date.post-recent-highlight{color:var(--post-recent-highlight-color);opacity:.8}.article-metadata .date.post-recent-highlight::after{font-size:80%;content:"NEW";border:2px solid var(--post-recent-highlight-color);padding:2px 3px;margin-left:8px}.tag.active{filter:saturate(.75)}@media screen and (min-width:900px){article .content{width:70%;margin:auto}}@media(max-width:900px){body{background-color:var(--base-color)}article{background-color:initial;box-shadow:none}article img:first-child,article video:first-child{max-width:100%}}.blog-navigation{display:grid;grid-template-columns:1fr 1fr;padding-top:30px;padding-bottom:60px}.blog-navigation .next{text-align:right}@media(max-width:900px){.blog-navigation{grid-template-columns:1fr;gap:20px;border-top:1px solid var(--code-background-color)}.blog-navigation .next{text-align:left}}.blog-navigation span{opacity:.6;font-weight:700;margin-bottom:5px;display:block}.blog-navigation a{display:inline-block;text-decoration:none;color:inherit;opacity:.6;transition:opacity .2s}.blog-navigation a:hover{opacity:1}</style><link rel=stylesheet href=/assets/css/highlight.obsidian.min.css><div class=container><article class=padded><div class="content article-container"><figure class=article-cover><img src=/storage/blog/covers/godotcon-2024.webp title alt=" " class=rounded-lg style=width:100%;height:auto;background-color:initial></figure><div class=article-info><h1>GodotCon 24 - Submit ideas! Get tickets!</h1><div class=article-metadata><div class=article-author><span>By: </span><img class=avatar width=25 height=25 src=/assets/images/authors/nat.jpg alt=Nat loading=lazy>
|
||||
<span class=by>Nat</span></div><span class=date data-post-date="2024-06-14 18:00:00 +0000">14 June 2024</span></div><div class=tags><a href=/blog/events><div class="tag active">Events</div></a></div></div><div class=article-body><table><tbody><tr><td>📅 Date<td>12th+13th of October<tr><td>📍 Location<td>Berlin, Germany<tr><td>🌐 Website<td>https://conference.godotengine.org/</table><p>After a very successful conference last year in Munich, we onboarded more lovely volunteers and expanded our offerings: this edition will have talks, workshops, a game/project showcase, and downtime activities around the venue.<p>The event grounds we chose offer ample space to simply sit and chat, especially if the weather permits using the outdoor spaces. Scattered across the floors you will also have the option to buy food & drink. We will definitely also use the opportunity to sell limited edition Godot merchandise.<p>To facilitate business meetings, we are currently setting up our own matchmaking software; stay tuned to learn more about it. It will be available for all attendees, no matter the ticket choice.<p>Have you thought about participating in the program yet? Take a look at our call for speakers and exhibitors below - this event is a collaborative effort between us and the community!<p><a href=https://talks.godotengine.org/godotcon-24/cfp><strong>➡️ Call for submissions</strong></a>, Deadline: 31st of July<p>Speaking of collaboration, we are actively looking for sponsors to support GodotCon not just monetarily, but also with content or products. If you or your company would be interested in learning more about the sponsorship ideas we have prepared, simply download this fact-sheet we put together and reach out to <a href=mailto:godotcon@godotengine.org>godotcon@godotengine.org</a>.<p><a href=https://conference.godotengine.org/downloads/godotcon24-factsheet-sponsoring.pdf><strong>⬇️ Sponsor factsheet</strong></a><p>Last but not least, as we collectively gear up to make this event a blast, people already have been gathering on our community Discord to share their excitement and reminisce about the past years together.
|
||||
<span class=by>Nat</span></div><span class=date data-post-date="2024-06-14 18:00:00 +0000">14 June 2024</span></div><div class=tags><a href=/blog/events><div class="tag active">Events</div></a></div></div><div class="card card-warning"><p>This article is from <strong>June 2024</strong>, some of its contents might be outdated and no longer accurate.<br>You can find up-to-date information about the engine in the <a href=https://docs.godotengine.org/en/stable/>official documentation</a>.</div><div class=article-body><table><tbody><tr><td>📅 Date<td>12th+13th of October<tr><td>📍 Location<td>Berlin, Germany<tr><td>🌐 Website<td>https://conference.godotengine.org/</table><p>After a very successful conference last year in Munich, we onboarded more lovely volunteers and expanded our offerings: this edition will have talks, workshops, a game/project showcase, and downtime activities around the venue.<p>The event grounds we chose offer ample space to simply sit and chat, especially if the weather permits using the outdoor spaces. Scattered across the floors you will also have the option to buy food & drink. We will definitely also use the opportunity to sell limited edition Godot merchandise.<p>To facilitate business meetings, we are currently setting up our own matchmaking software; stay tuned to learn more about it. It will be available for all attendees, no matter the ticket choice.<p>Have you thought about participating in the program yet? Take a look at our call for speakers and exhibitors below - this event is a collaborative effort between us and the community!<p><a href=https://talks.godotengine.org/godotcon-24/cfp><strong>➡️ Call for submissions</strong></a>, Deadline: 31st of July<p>Speaking of collaboration, we are actively looking for sponsors to support GodotCon not just monetarily, but also with content or products. If you or your company would be interested in learning more about the sponsorship ideas we have prepared, simply download this fact-sheet we put together and reach out to <a href=mailto:godotcon@godotengine.org>godotcon@godotengine.org</a>.<p><a href=https://conference.godotengine.org/downloads/godotcon24-factsheet-sponsoring.pdf><strong>⬇️ Sponsor factsheet</strong></a><p>Last but not least, as we collectively gear up to make this event a blast, people already have been gathering on our community Discord to share their excitement and reminisce about the past years together.
|
||||
Even if you do not plan to attend this installment, we recommend taking a look for potential business contacts and to be the first to know about any future events.<p><a href=https://discord.gg/nAcE7msd5H><strong>➡️ Join the GodotCon Discord</strong></a><p>See you in autumnal, pumpkin-spice smelling, hopefully not too cold Berlin! 🍂🥧</div></div></article><div class=blog-navigation><div class=previous><span>Previous</span>
|
||||
<a rel=prev href=/article/migrating-animations-from-godot-4-0-to-4-3/>Migrating Animations from Godot 4.0 to 4.3</a></div><div class=next><span>Next</span>
|
||||
<a rel=next href=/article/dev-snapshot-godot-4-3-beta-2/>Dev snapshot: Godot 4.3 beta 2</a></div></div></div><link rel=stylesheet href=/assets/css/anchor-link.css?1><link rel=stylesheet href=/assets/css/article-cards.css?3><script src=/assets/js/anchor-link.js></script><script>document.addEventListener("DOMContentLoaded",()=>{window.applyAnchorLinks(".article-body"),document.querySelectorAll(".article-cover img, .article-body img").forEach(e=>{if(e.classList.contains("lightbox-ignore"))return;const t=document.createElement("a");t.href=e.src,t.classList.add("lightbox"),t.dataset.group="article",e.parentNode.appendChild(t),t.appendChild(e)})})</script></main><footer class=footer-global><div class=wrapper><div class=columns><div class=col><h2>Godot Engine</h2><ul><li><a class=set-os-download-url href=/download>Download</a><li><a href=https://docs.godotengine.org>Documentation</a><li><a href=/features/>Features</a><li><a href=https://editor.godotengine.org/releases/latest/>Web editor</a><li><a href=/download/archive/>Release archive</a><li><a href=https://github.com/godotengine>Source code</a></ul></div><div class=col><h2>Project</h2><ul><li><a href=/blog/>Blog</a><li><a href=/code-of-conduct/>Code of conduct</a><li><a href=/governance/>Governance</a><li><a href=/teams/>Teams</a><li><a href=/priorities/>Priorities</a><li><a href=/community/>Communities</a></ul></div><div class=col><h2>Resources</h2><ul><li><a href=https://godotengine.org/asset-library/asset>Asset library</a><li><a href=/press/>Press kit</a><li><a href=/showcase/>Showcase</a><li><a href=/education/>Education</a><li><a href=/consoles/>Console support</a></ul></div><div class=col><h2>Foundation</h2><ul><li><a href=https://godot.foundation/>About</a><li><a href=https://fund.godotengine.org>Donate</a><li><a href=/license/>License</a><li><a href=/privacy-policy/>Privacy policy</a><li><a href=/contact/>Contact us</a></ul></div></div><hr><div class=credits-and-socials><p>© 2007-2025 Juan Linietsky, Ariel Manzur and <a href=https://github.com/godotengine/godot/blob/master/AUTHORS.md target=_blank rel=noopener>contributors</a>. Hosted by the <a href=https://godot.foundation/ target=_blank rel=noopener>Godot Foundation</a>. Website <a href=https://github.com/godotengine/godot-website target=_blank rel=noopener>source code on GitHub</a>.<div class=social><a href=https://github.com/godotengine target=_blank rel=noopener title=GitHub><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6.0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6.0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3.0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1.0-6.2-.3-40.4-.3-61.4.0.0-70 15-84.7-29.8.0.0-11.4-29.1-27.8-36.6.0.0-22.9-15.7 1.6-15.4.0.0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5.0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9.0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4.0 33.7-.3 75.4-.3 83.6.0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6.0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9.0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
|
||||
|
||||
24
article/inverse-kinematics-returns-to-godot-4-6/index.html
Normal file
24
article/inverse-kinematics-returns-to-godot-4-6/index.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<!doctype html><html lang=en><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=author content="Godot Engine"><meta name=description content="Now Godot has Inverse Kinematics in 3D."><script defer data-domain=godotengine.org src=https://plausible.godot.foundation/js/script.file-downloads.outbound-links.js></script><meta property="og:site_name" content="Godot Engine"><meta property="og:url" content="https://godotengine.org/article/inverse-kinematics-returns-to-godot-4-6/"><meta property="og:type" content="website"><meta property="og:description" content="Now Godot has Inverse Kinematics in 3D."><meta property="og:image" content="https://godotengine.org/storage/blog/covers/inverse-kinematics-returns-to-godot-4-6.webp"><meta name=twitter:card content="summary_large_image"><meta property="twitter:domain" content="godotengine.org"><meta property="twitter:url" content="https://godotengine.org/article/inverse-kinematics-returns-to-godot-4-6/"><meta property="og:title" content="Inverse Kinematics Returns to Godot 4.6 – Godot Engine"><title>Inverse Kinematics Returns to Godot 4.6 – Godot Engine</title>
|
||||
<link rel=alternate type=application/rss+xml title="Godot News" href=/rss.xml><link rel=alternate type=application/json title="Godot News" href=/rss.json><link rel=alternate type=application/atom+xml title="Godot News" href=/atom.xml><link rel=icon href=/assets/favicon.png sizes=any><link rel=icon href=/assets/favicon.svg type=image/svg+xml><link rel=stylesheet href=/assets/css/main.css?121><link rel=stylesheet href=/assets/css/header.css?6><link rel=stylesheet href=/assets/css/tobii.min.css><link rel=preload as=font href=/assets/fonts/Montserrat-Italic-VariableFont_wght.woff2 crossorigin><link rel=preload as=font href=/assets/fonts/Montserrat-VariableFont_wght.woff2 crossorigin><link rel=me href=https://mastodon.gamedev.place/@godotengine><style>.donation-header{background-color:#ffa700;color:#000;padding:15px;text-align:center;padding:40px 15px;font-size:1.5em;display:none}.donation-header.visible{display:block}.donation-header h2{color:#000;margin-bottom:0;font-size:1.5em}.donation-header p{margin-top:0}.donation-header img{position:absolute;right:10px;top:10px;filter:invert(1);cursor:pointer}.donation-header .btn{background:#000;color:#fff}@media(max-width:600px){.donation-header{font-size:1.2em}}</style><div class=donation-header id=donation-header><img src=/assets/icons/cross.svg width=24 height=24 alt=Close title=Close id=donation-header-close onclick=dismissHeader()><h2>Donate to Godot!</h2><p>This has been a great year for the engine, but there are still a lot of things we would love to do.<br>If everyone visiting the site would donate €5, we could hire 5 more developers to work on Godot full-time.<br></p><a class=btn href="https://fund.godotengine.org/?ref=december-2025" onclick=dismissHeader(!0)>Donate Now</a></div><script>function dismissHeader(e=!1){var t=new Date;e?t.setTime(t.getTime()+30*24*60*60*1e3):(t.setTime(t.getTime()+48*60*60*1e3),document.getElementById("donation-header").classList.remove("visible")),document.cookie="donationHeaderClosed=1;expires="+t.toUTCString()+";path=/"}document.addEventListener("DOMContentLoaded",function(){var e=document.getElementById("donation-header");document.cookie.includes("donationHeaderClosed=1")||e.classList.add("visible")})</script><input type=checkbox id=nav_toggle_cb><header class="flex column"><div class="container flex align-center"><div id=nav_head><a href=/ id=logo-link><img class=nav-logo src=/assets/logo.svg width=136 height=48 alt="Godot Engine">
|
||||
<img class="nav-logo dark-logo" src=/assets/logo_dark.svg width=136 height=48 alt="Godot Engine"></a><div class=mobile-links><span class="fund mobile"><a href=https://fund.godotengine.org><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width:13px;fill:#fff;margin-right:4px"><path d="M47.6 300.4 228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6.0 115.2.0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg> Donate</a></span>
|
||||
<label for=nav_toggle_cb id=nav_toggle_btn><img src=/assets/icons/hamburger.svg width=24 height=24 alt="Main menu"></label></div></div><nav id=nav><ul class=left><li><a href=/features/ data-dropdown=features-dropdown>Features</a><li class=mobile-only><a href=/consoles/>Console support</a><li class=mobile-only><a href=/priorities/>Priorities</a><li><a href=/showcase/>Showcase</a><li><a href=/blog/>Blog</a><li><a href=/community/ data-dropdown=community-dropdown>Community</a><li><a href=https://godotengine.org/asset-library/asset>Assets</a></ul><ul class=right><li><a href=/download/windows/ class=set-os-download-url>Download</a><li><a href=https://docs.godotengine.org>Docs</a><li><a href=https://contributing.godotengine.org/en/latest/organization/how_to_contribute.html>Contribute</a><li class="fund desktop"><a href=https://fund.godotengine.org><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="width:13px;fill:#fff;margin-right:4px;top:1px;position:relative"><path d="M47.6 300.4 228.3 469.1c7.5 7 17.4 10.9 27.7 10.9s20.2-3.9 27.7-10.9L464.4 300.4c30.4-28.3 47.6-68 47.6-109.5v-5.8c0-69.9-50.5-129.5-119.4-141C347 36.5 300.6 51.4 268 84L256 96 244 84c-32.6-32.6-79-47.5-124.6-39.9C50.5 55.6.0 115.2.0 185.1v5.8c0 41.5 17.2 81.2 47.6 109.5z"/></svg> Donate</a></ul></nav></div></header><div class=nav-dropdown-menu id=features-dropdown><a href=/features/ class=touch-only>Features</a>
|
||||
<a href=/consoles/>Console support</a>
|
||||
<a href=/priorities/>Priorities</a></div><div class=nav-dropdown-menu id=community-dropdown><a href=/community/ class=touch-only>Community</a>
|
||||
<a href=https://forum.godotengine.org>Forum</a>
|
||||
<a href=/events/>Events</a></div><script>document.addEventListener("DOMContentLoaded",function(){const e=document.querySelectorAll("[data-dropdown]");e.forEach(e=>{const n=e.getAttribute("data-dropdown"),t=document.getElementById(n);if(t){let n=-1;const i=()=>{if(n===-1)return;clearTimeout(n),n=-1},a=()=>t.style.display==="block",r=()=>{if(a())return;if(window.innerWidth<1200)return;i();const n=e.getBoundingClientRect();t.style.top=n.bottom+"px",t.style.left=n.left+"px",t.style.display="block",e.classList.add("dropdown-open")},s=({instant:s=!1}={})=>{if(!a())return;const o=()=>{i(),t.style.display="none",e.classList.remove("dropdown-open")};if(s){o();return}n=setTimeout(o,100)},l=e=>{if(window.innerWidth<1200)return;e.preventDefault(),a()?s({instant:!0}):r()},c=e=>t=>{t.pointerType==="touch"&&e(t)},o=e=>t=>{t.pointerType!=="touch"&&e(t)};e.addEventListener("pointerup",c(e=>l(e))),document.documentElement.addEventListener("pointerup",c(n=>{!e.contains(n.target)&&!t.contains(n.target)&&s({instant:!0})})),e.addEventListener("pointerenter",o(e=>r())),e.addEventListener("pointerleave",o(e=>s())),t.addEventListener("pointerenter",o(e=>i())),t.addEventListener("pointerleave",o(e=>s()))}})})</script><main><style>body{background-color:var(--background-color)}h1{margin-bottom:8px;margin-top:32px}:not(pre)>code{background:var(--code-background-color);padding:1px 4px;font-size:.95em;border-radius:3px}pre{background:var(--codeblock-background-color);color:var(--codeblock-color)}pre code{display:block;overflow-x:auto;padding:.5em}.date-big{line-height:2;margin-left:32px}article{background-color:var(--base-color);box-shadow:0 3px 2px rgba(0,0,0,.15)}figure{margin:0}figure img{margin:0}article img,article video{max-width:100%;height:auto;display:block;margin:auto;margin-top:16px;margin-bottom:16px}article h1{margin-top:64px}article h2,article h3,article h4{margin-top:42px}.article-info{display:flex;flex-direction:column;gap:8px}.article-metadata{display:flex;gap:24px;align-items:center;font-family:var(--header-font-family);margin-bottom:12px}@media(max-width:900px){.article-metadata{flex-direction:column;align-items:flex-start;gap:16px}}.article-author{color:var(--base-color-text-subtitle-date);font-weight:700;font-size:18px;flex-grow:1;display:flex;gap:12px;align-items:center}.article-author .avatar{border-radius:100%;margin:0;background:0 0}.article-author .by{color:var(--base-color-text-subtitle)}.article-metadata .date{color:var(--base-color-text-subtitle-date)}.article-metadata .date.post-recent-highlight{color:var(--post-recent-highlight-color);opacity:.8}.article-metadata .date.post-recent-highlight::after{font-size:80%;content:"NEW";border:2px solid var(--post-recent-highlight-color);padding:2px 3px;margin-left:8px}.tag.active{filter:saturate(.75)}@media screen and (min-width:900px){article .content{width:70%;margin:auto}}@media(max-width:900px){body{background-color:var(--base-color)}article{background-color:initial;box-shadow:none}article img:first-child,article video:first-child{max-width:100%}}.blog-navigation{display:grid;grid-template-columns:1fr 1fr;padding-top:30px;padding-bottom:60px}.blog-navigation .next{text-align:right}@media(max-width:900px){.blog-navigation{grid-template-columns:1fr;gap:20px;border-top:1px solid var(--code-background-color)}.blog-navigation .next{text-align:left}}.blog-navigation span{opacity:.6;font-weight:700;margin-bottom:5px;display:block}.blog-navigation a{display:inline-block;text-decoration:none;color:inherit;opacity:.6;transition:opacity .2s}.blog-navigation a:hover{opacity:1}</style><link rel=stylesheet href=/assets/css/highlight.obsidian.min.css><div class=container><article class=padded><div class="content article-container"><figure class=article-cover><img src=/storage/blog/covers/inverse-kinematics-returns-to-godot-4-6.webp title alt=" " class=rounded-lg style=width:100%;height:auto;background-color:initial></figure><div class=article-info><h1>Inverse Kinematics Returns to Godot 4.6</h1><div class=article-metadata><div class=article-author><span>By: </span><img class=avatar width=25 height=25 src=/assets/images/authors/tokage.png alt="Silc Renew" loading=lazy>
|
||||
<span class=by>Silc Renew</span></div><span class=date data-post-date="2025-12-16 10:00:00 +0000">16 December 2025</span></div><div class=tags><a href=/blog/progress-report><div class="tag active">Progress Report</div></a></div></div><div class=article-body><style>article .content img{background-color:initial}</style><p>In Godot 4.6, IK is back in 3D!<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/picture01.webp alt="IK on the table"><p>Of course, “IK” means inverse kinematics.<p>If you have experience with Godot 3.x, you might remember that IK was removed during the upgrade to 4.0. I explained in a <a href=/article/design-of-the-skeleton-modifier-3d/>previous blog post</a> that it was removed because the old skeleton API design had issues and needed reworking.<p>Then, you might wonder if it was theoretically possible to implement IK alongside the <code class="language-plaintext highlighter-rouge">SkeletonModifier3D</code> implementation in 4.4. However, we had to avoid adding immature features and then hastily removing it again. To implement IK, we staged the elements for the entire IK across three versions.<p>This blog post will explain that journey.<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/picture02.webp alt="Journey is begun"><h1 id=godot-44>Godot 4.4</h1><p>In Godot 4.4, I implemented the base class for <code class="language-plaintext highlighter-rouge">SkeletonModifier3D</code>, along with two new modifiers, <code class="language-plaintext highlighter-rouge">LookAtModifier3D</code> and <code class="language-plaintext highlighter-rouge">RetargetModifier3D</code>.<h2 id=skeletonmodifier3d--lookatmodifier3d>SkeletonModifier3D / LookAtModifier3D</h2><p><code class="language-plaintext highlighter-rouge">LookAtModifier3D</code> was the minimal implementation to verify that the <code class="language-plaintext highlighter-rouge">SkeletonModifier3D</code> design was correct. <code class="language-plaintext highlighter-rouge">LookAtModifier3D</code> could be considered equivalent to one-bone IK, so it was suitable as a test case.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-look-at-modifier-3d.webm?1 type=video/webm></video><h2 id=retargetmodifier3d>RetargetModifier3D</h2><p>However, when implementing <code class="language-plaintext highlighter-rouge">LookAtModifier3D</code>, I confirmed that users must specify the bone axis based on the bone rest. It was my initial concern that the retarget feature implemented in 4.0 discarded the bone rests of the imported skeleton.<p>As this concern became a certainty, I attempted to preserve bone rests by implementing <code class="language-plaintext highlighter-rouge">RetargetModifier3D</code>.<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/inspector-retarget-modifier-3d.webp alt="Inspector of RetargetModifier3D"><p>It was fortunate for me that the processing order design of <code class="language-plaintext highlighter-rouge">SkeletonModifier3D</code> matched the requirements for implementing <code class="language-plaintext highlighter-rouge">RetargetModifier3D</code>.<h1 id=godot-45>Godot 4.5</h1><p>In Godot 4.5, I implemented <code class="language-plaintext highlighter-rouge">SpringBoneSimulator3D</code> and <code class="language-plaintext highlighter-rouge">BoneConstraint3D</code> (and its three child classes <code class="language-plaintext highlighter-rouge">AimModifier3D</code>, <code class="language-plaintext highlighter-rouge">ConvertTransformModifier3D</code> and <code class="language-plaintext highlighter-rouge">CopyTransformModifier3D</code>).<p>By the way, I’m involved in a project that utilizes a 3D character model format known as <a href=https://vrm.dev/>VRM</a>. VRM has implementations of <a href=https://vrm.dev/en/vrm1/springbone/>SpringBone</a> and <a href=https://vrm.dev/en/vrm1/constraint/>Constraint</a> as model-specific configurations that can be ported to cross-platform environments, so ensuring compatibility with these was one of the purposes.<h2 id=springbonesimulator3d>SpringBoneSimulator3D</h2><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-spring-bone-simulator-3d.webm?1 type=video/webm></video><p>One challenging part of implementing <code class="language-plaintext highlighter-rouge">SpringBoneSimulator3D</code> was creating the bone chain internally. Specifically, by setting the root bone as the ancestor and the end bone as the descendant, we could retrieve the bones between them and automatically construct the joint array.<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/inspector-spring-bone-simulator-3d.webp alt="Inspector of SpringBoneSimulator3D"><p>Compared to users manually creating these arrays, this approach reduced user operations and validation on the core side, making it beneficial for both ends.<h2 id=boneconstraint3d-and-3-child-classes>BoneConstraint3D (and 3 child classes)</h2><p><code class="language-plaintext highlighter-rouge">BoneConstraint3D</code> is a feature that allows bones to interact with other bones. The actual behavior and calculations it provides are simple.<p>What was challenging here was the design for a base class containing a virtual struct array as a member and extending that struct in a child class. This topic is a bit more advanced for beginner coders, but when using struct arrays as properties in Godot, you need to implement a slightly tricky approach.<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/inspector-bone-constraint-3d.webp alt="Inspector of BoneConstraint3D"><p>I already had the design idea that IK would have a base class similar to <code class="language-plaintext highlighter-rouge">BoneConstraint3D</code>, with child classes extending the structure to implement the actual solver. So, I was confident that merging and establishing that method at this point would be beneficial for IK.<h1 id=godot-46>Godot 4.6</h1><p>Finally, I began implementing IK in Godot 4.6.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-ik-modifier-3d.webm?1 type=video/webm></video><h2 id=ikmodifier3d-and-7-child-classes>IKModifier3D (and 7 child classes)</h2><p>As a first step, I defined <code class="language-plaintext highlighter-rouge">IKModifier3D</code> and <code class="language-plaintext highlighter-rouge">ChainIK3D</code> by reusing <code class="language-plaintext highlighter-rouge">BoneConstraint3D</code> and <code class="language-plaintext highlighter-rouge">SpringBoneSimulator3D</code>. After that, I implemented the process for moving joints called the IK solver.<p>Therefore, <code class="language-plaintext highlighter-rouge">IKModifier3D</code> has the following child classes:<ul><li>IKModifier3D<ul><li>TwoBoneIK3D<li>ChainIK3D<ul><li>SplineIK3D<li>IterateIK3D<ul><li>FABRIK3D<li>CCDIK3D<li>JacobianIK3D</ul></ul></ul></ul><p>When implementing those IKs, I made sure to keep them to the minimum functions.<p>Some IK systems outside of Godot might have additional “processing to make the IK results look better”, separate from the core calculation algorithm that rotates the bones. In the rich IK system, the IK class may include them and can enable their processing by their bool property.<p>Then, I believed separating them would help maintain maintainability and extendability. In other words, if only the “processing to make the IK results look better” can be reused, when users want to implement custom IK, they only need to implement a minimal IK solver.<p>The following are the improvements and additions made in Godot 4.6 to make the IK results look better.<h2 id=tweak-boneconstraint3d>Tweak BoneConstraint3D</h2><p>For example, there are cases where Twist is applied before IK calculation, or where the end bone is directed toward the IK target after IK calculation.<p>In Godot 4.5, the <code class="language-plaintext highlighter-rouge">BoneConstraint3D</code> could only assign bones as reference objects, but in 4.6, it can now assign [Node3D] objects.<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/inspector-new-bone-constraint-3d.webp alt="Inspector of new BoneConstraint3D"><p>This tweaking allows <code class="language-plaintext highlighter-rouge">BoneConstraint3D</code> to be used to perform these additional rotations.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-bone-constraint-3d.webm?1 type=video/webm></video><p><a href=/storage/blog/inverse-kinematics-returns-to-godot-4-6/adjusted-ik-3d-demo.zip>adjusted-ik-3d-demo.zip</a><h2 id=bonetwistdisperser3d>BoneTwistDisperser3D</h2><p>In theory, using <code class="language-plaintext highlighter-rouge">ConvertTransform3D</code> allows you to apply the rotation of descendant bones to their ancestors. However, the process for setting this up properly was somewhat complex and could only be handled by advanced users.<p><code class="language-plaintext highlighter-rouge">BoneTwistDisperser3D</code> provides a simple way to achieve that process.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-bone-twist-disperser-3d.webm?1 type=video/webm></video><h2 id=limitangularvelocitymodifier3d>LimitAngularVelocityModifier3D</h2><p><code class="language-plaintext highlighter-rouge">LimitAngularVelocityModifier3D</code> is a modifier that limits angular velocity. The behavior is quite simple, so it doesn’t need much explanation.<p>However, it’s worth learning that there are two types of IK.<h2 id=deterministic-ik>Deterministic IK</h2><p>In computer science, “deterministic” means that the result is always the same for a given input. In particular, for game applications like Godot, the term means that the result does not depend on the state of the previous frame. Incidentally, since <code class="language-plaintext highlighter-rouge">AnimationMixer</code> already has a <a href=/article/migrating-animations-from-godot-4-0-to-4-3/#deterministic-blending>deterministic option</a>, that immediately made me decide to adopt this term.<p><code class="language-plaintext highlighter-rouge">TwoBoneIK3D</code> and <code class="language-plaintext highlighter-rouge">SplineIK3D</code> are always deterministic. However, in <code class="language-plaintext highlighter-rouge">IterateIK3D</code>, whether it is deterministic depends on the options.<p><code class="language-plaintext highlighter-rouge">IterateIK3D</code> repeats the routine provided by the solver to approach the end bone toward its goal. At this point, the number of repetitions per frame depends on the option.<p>When the deterministic option is disabled, it means that the iteration is performed by carrying over the state from the previous frame. In this case, even with a small number of iterations per frame, the end bone can reach the goal eventually as frames progress.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-non-deterministic-ik-3d.webm?1 type=video/webm></video><p>In contrast, when the deterministic option is enabled, the previous frame’s state is not carried over. Therefore, if the number of iterations per frame is small, the end bone may never reach its goal.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-deterministic-ik-3d.webm?1 type=video/webm></video><p>However, if you want to ensure consistent results depending on the relative position between the IK target and the skeleton, the deterministic option is useful. For example, it is ideal for online applications where only the coordinates of the IK target are shared to synchronize the model’s pose.<p>As a point to note, deterministic IK cannot avoid causing rotation with large angular velocities by its design. It goes without saying that <code class="language-plaintext highlighter-rouge">LimitAngularVelocityModifier3D</code> is useful for smoothing this out.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-limit-angular-velocity-modifier-3d.webm?1 type=video/webm></video><h1 id=looking-back-on-the-journey>Looking back on the journey</h1><p>Between versions 4.4 and 4.6, excluding migrations, including base classes, 19 new <code class="language-plaintext highlighter-rouge">SkeletonModifier</code>s have been implemented!<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/inspector-skeleton-modifier-3d.webp alt="Inspector of SkeletonModifier3D"><p>There are many possibilities depending on how you combine them. So we have a plan to add detailed explanations and tutorials to the documentation in the future, but since that is expected to be quite large, we will need more time…<p><img src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/picture03.webp alt="Rest tasks"><p>For now, I’ll show you just one example in advance. This setup emulates the old <code class="language-plaintext highlighter-rouge">SkeletonIK3D</code>’s magnet option.</p><video autoplay loop muted playsinline>
|
||||
<source src=/storage/blog/inverse-kinematics-returns-to-godot-4-6/preview-magnet-ik-3d.webm?1 type=video/webm></video><p><a href=/storage/blog/inverse-kinematics-returns-to-godot-4-6/magnet-ik-3d-demo.zip>magnet-ik-3d-demo.zip</a><p>As you can see from that example, it was just a 2-path deterministic FABRIK. As explained above, it was also “processing to make the IK results look better”, and I think you can understand that the process could be separated.<p>At last, I wish you all the best in creating fun games using <code class="language-plaintext highlighter-rouge">SkeletonModifier3D</code>s.<h2 id=support>Support</h2><p>Godot is a non-profit, open-source game engine developed by hundreds of contributors in their free time, as well as a handful of part or full-time developers hired thanks to <a href=https://fund.godotengine.org/>generous donations from the Godot community</a>. A big thank you to everyone who has contributed <a href=https://github.com/godotengine/godot/blob/master/AUTHORS.md>their time</a> or <a href=https://github.com/godotengine/godot/blob/master/DONORS.md>their financial support</a> to the project!<p>If you’d like to support the project financially and help us secure our future hires, you can do so using the <a href=https://fund.godotengine.org/>Godot Development Fund</a> platform managed by <a href=https://godot.foundation/>Godot Foundation</a>. There are also several <a href=/donate>alternative ways to donate</a> which you may find more suitable.</div></div></article><div class=blog-navigation><div class=previous><span>Previous</span>
|
||||
<a rel=prev href=/article/dev-snapshot-godot-4-6-beta-1/>Dev snapshot: Godot 4.6 beta 1</a></div></div></div><link rel=stylesheet href=/assets/css/anchor-link.css?1><link rel=stylesheet href=/assets/css/article-cards.css?3><script src=/assets/js/anchor-link.js></script><script>document.addEventListener("DOMContentLoaded",()=>{window.applyAnchorLinks(".article-body"),document.querySelectorAll(".article-cover img, .article-body img").forEach(e=>{if(e.classList.contains("lightbox-ignore"))return;const t=document.createElement("a");t.href=e.src,t.classList.add("lightbox"),t.dataset.group="article",e.parentNode.appendChild(t),t.appendChild(e)})})</script></main><footer class=footer-global><div class=wrapper><div class=columns><div class=col><h2>Godot Engine</h2><ul><li><a class=set-os-download-url href=/download>Download</a><li><a href=https://docs.godotengine.org>Documentation</a><li><a href=/features/>Features</a><li><a href=https://editor.godotengine.org/releases/latest/>Web editor</a><li><a href=/download/archive/>Release archive</a><li><a href=https://github.com/godotengine>Source code</a></ul></div><div class=col><h2>Project</h2><ul><li><a href=/blog/>Blog</a><li><a href=/code-of-conduct/>Code of conduct</a><li><a href=/governance/>Governance</a><li><a href=/teams/>Teams</a><li><a href=/priorities/>Priorities</a><li><a href=/community/>Communities</a></ul></div><div class=col><h2>Resources</h2><ul><li><a href=https://godotengine.org/asset-library/asset>Asset library</a><li><a href=/press/>Press kit</a><li><a href=/showcase/>Showcase</a><li><a href=/education/>Education</a><li><a href=/consoles/>Console support</a></ul></div><div class=col><h2>Foundation</h2><ul><li><a href=https://godot.foundation/>About</a><li><a href=https://fund.godotengine.org>Donate</a><li><a href=/license/>License</a><li><a href=/privacy-policy/>Privacy policy</a><li><a href=/contact/>Contact us</a></ul></div></div><hr><div class=credits-and-socials><p>© 2007-2025 Juan Linietsky, Ariel Manzur and <a href=https://github.com/godotengine/godot/blob/master/AUTHORS.md target=_blank rel=noopener>contributors</a>. Hosted by the <a href=https://godot.foundation/ target=_blank rel=noopener>Godot Foundation</a>. Website <a href=https://github.com/godotengine/godot-website target=_blank rel=noopener>source code on GitHub</a>.<div class=social><a href=https://github.com/godotengine target=_blank rel=noopener title=GitHub><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6.0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6.0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3.0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1.0-6.2-.3-40.4-.3-61.4.0.0-70 15-84.7-29.8.0.0-11.4-29.1-27.8-36.6.0.0-22.9-15.7 1.6-15.4.0.0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5.0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9.0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4.0 33.7-.3 75.4-.3 83.6.0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6.0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9.0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg>
|
||||
</a><a href=https://bsky.app/profile/godotengine.org target=_blank rel=noopener title=Bluesky><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M407.8 294.7c-3.3-.4-6.7-.8-10-1.3 3.4.4 6.7.9 10 1.3zM288 227.1C261.9 176.4 190.9 81.9 124.9 35.3 61.6-9.4 37.5-1.7 21.6 5.5 3.3 13.8.0 41.9.0 58.4S9.1 194 15 213.9c19.5 65.7 89.1 87.9 153.2 80.7 3.3-.5 6.6-.9 10-1.4-3.3.5-6.6 1-10 1.4-93.9 14-177.3 48.2-67.9 169.9C220.6 589.1 265.1 437.8 288 361.1c22.9 76.7 49.2 222.5 185.6 103.4 102.4-103.4 28.1-156-65.8-169.9-3.3-.4-6.7-.8-10-1.3 3.4.4 6.7.9 10 1.3 64.1 7.1 133.6-15.1 153.2-80.7C566.9 194 576 75 576 58.4s-3.3-44.7-21.6-52.9c-15.8-7.1-40-14.9-103.2 29.8C385.1 81.9 314.1 176.4 288 227.1z"/></svg>
|
||||
</a><a href=https://mastodon.gamedev.place/@godotengine target=_blank rel=noopener title=Mastodon><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5.0.0.0-63.7 28.5-63.7 125.7.0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54a102.5 102.5.0 01-.9-13.9c85.6 20.9 158.7 9.1 178.8 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zm-75.1 125.2h-46.6V190.1c0-49.7-64-51.6-64 6.9v62.5H201V197c0-58.5-64-56.6-64-6.9v114.2H90.2c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175z"/></svg>
|
||||
</a><a href=https://discord.gg/godotengine target=_blank rel=noopener title=Discord><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M524.5 69.8a1.5 1.5.0 00-.8-.7A485.1 485.1.0 00404.1 32a1.8 1.8.0 00-1.9.9 337.5 337.5.0 00-14.9 30.6 447.8 447.8.0 00-134.4.0 309.5 309.5.0 00-15.1-30.6 1.9 1.9.0 00-1.9-.9A483.7 483.7.0 00116.1 69.1a1.7 1.7.0 00-.8.7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 00.8 1.4A487.7 487.7.0 00176 479.9a1.9 1.9.0 002.1-.7 348.2 348.2.0 0030-48.8 1.9 1.9.0 00-1-2.6 321.2 321.2.0 01-45.9-21.9 1.9 1.9.0 01-.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8.0 011.9-.3c96.2 43.9 200.4 43.9 295.5.0a1.8 1.8.0 011.9.2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9.0 01-.2 3.1 301.4 301.4.0 01-45.9 21.8 1.9 1.9.0 00-1 2.6 391.1 391.1.0 0030 48.8 1.9 1.9.0 002.1.7 486 486 0 00147.2-74.1 1.9 1.9.0 00.8-1.4c12.2-126.7-20.6-236.8-87-334.5zm-302 267.8c-29 0-52.8-26.6-52.8-59.2s23.4-59.3 52.8-59.3c29.7.0 53.3 26.8 52.8 59.2.0 32.7-23.4 59.3-52.8 59.3zm195.4.0c-29 0-52.8-26.6-52.8-59.2s23.3-59.3 52.8-59.3c29.7.0 53.3 26.8 52.8 59.2.0 32.7-23.2 59.3-52.8 59.3z"/></svg>
|
||||
</a><a href=https://www.reddit.com/r/godot title=Reddit target=_blank rel=noopener><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 256C0 114.6 114.6.0 256 0S512 114.6 512 256 397.4 512 256 512H37.1c-13.7.0-20.5-16.5-10.9-26.2L75 437C28.7 390.7.0 326.7.0 256zM349.6 153.6c23.6.0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6.0-37.8 14.6-41.8 34-34.5 3.7-61.4 33-61.4 68.4v.2c-37.5 1.6-71.8 12.3-99 29.1-10.1-7.8-22.8-12.5-36.5-12.5-33 0-59.8 26.8-59.8 59.8.0 24 14.1 44.6 34.4 54.1 2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54 0-33-26.8-59.8-59.8-59.8-13.7.0-26.3 4.6-36.4 12.4-27.4-17-62.1-27.7-1e2-29.1v-.2c0-25.4 18.9-46.5 43.4-49.9 4.4 18.8 21.3 32.8 41.5 32.8zM177.1 246.9c16.7.0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6-31.4-8.8-30.4-30.5S160.3 247 177 247zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6c-1-21.7 11.8-39.3 28.5-39.3s31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9.8-6.2 3.9-6.5 18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1.3 5.1 3.6 3.9 6.5z"/></svg>
|
||||
</a><a href=/rss.xml title=RSS target=_blank rel=noopener><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M64 32C28.7 32 0 60.7.0 96V416c0 35.3 28.7 64 64 64h320c35.3.0 64-28.7 64-64V96c0-35.3-28.7-64-64-64H64zM96 136c0-13.3 10.7-24 24-24 137 0 248 111 248 248 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-110.5-89.5-2e2-2e2-2e2-13.3.0-24-10.7-24-24zm0 96c0-13.3 10.7-24 24-24 83.9.0 152 68.1 152 152 0 13.3-10.7 24-24 24s-24-10.7-24-24c0-57.4-46.6-104-104-104-13.3.0-24-10.7-24-24zm0 120a32 32 0 1164 0 32 32 0 11-64 0z"/></svg></a></div></div></div></footer><script defer src=/assets/js/localize.js?7></script><script defer src=/assets/js/tobii.min.js></script><script defer src=/assets/js/highlight.min.js?1></script><script defer src=/assets/js/highlight.gdscript.min.js?1></script><script>document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("pre:not(.manual) code").forEach(e=>{hljs.highlightBlock(e)}),document.querySelectorAll("[data-post-date]").forEach(e=>{Date.parse(e.dataset.postDate)>Date.now()-1e3*60*60*48&&e.classList.add("post-recent-highlight")}),new Tobii({zoom:!1});const e=document.querySelectorAll(".set-os-download-url");for(let n=0;n<e.length;n++){const s=e[n];let o="download";"version"in s.dataset&&s.dataset.version==="3"&&(o="download/3.x");let t="windows";navigator.platform.indexOf("Mac")!==-1?t="macos":navigator.userAgent.indexOf("Android")!==-1?t="android":navigator.platform.indexOf("Linux")!==-1&&(t="linux"),s.href=`/${o}/${t}/`}})</script>
|
||||
Reference in New Issue
Block a user