converted two more devlogs to markdown
@@ -19,9 +19,6 @@
|
||||
element.classList += "toc-level-" + getHeaderLevel(header);
|
||||
element.href = `#${headerId}`;
|
||||
element.innerHTML = `${(header as HTMLElement).innerHTML}`;
|
||||
// var element = document.createElement("span");
|
||||
// element.classList += "toc-level-" + getHeaderLevel(header);
|
||||
// element.innerHTML = `<a href="#${headerId}">${(header as HTMLElement).innerHTML}</a>`;
|
||||
container.appendChild(element);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
<script lang="ts">
|
||||
import BannerTitleAlt from "$lib/banner-title-alt.svelte";
|
||||
import ContentSidebar from "$lib/content-sidebar.svelte";
|
||||
import LinkList, { type LinkEntry } from "$lib/link-list.svelte";
|
||||
import TableOfContents from "$lib/table-of-contents.svelte";
|
||||
|
||||
let builds: LinkEntry[] = [
|
||||
{
|
||||
text: "2023-10-07 (Protagonist #1)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2023-10-07.zip",
|
||||
},
|
||||
{
|
||||
text: "2023-12-23 (Protagonist #2)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2023-12-23.zip",
|
||||
},
|
||||
{
|
||||
text: "2024-03-25 (Protagonist #3 with jump animations)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2024-03-25.zip",
|
||||
},
|
||||
{
|
||||
text: "2025-08-16 (Laura era) [same build as the web version]",
|
||||
link: "https://files.denizk0461.dev/projectn5/2025-08-16.zip",
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>Freeing the Past | denizk0461</title>
|
||||
</svelte:head>
|
||||
|
||||
<BannerTitleAlt
|
||||
title="Freeing the Past"
|
||||
subtitle="Project N5 Devlog"
|
||||
date="2025-08-16"
|
||||
banner="../../previews/2025/0816.webp"
|
||||
bannerAlt="Bottom-up view at Laura v1 in front of a blue sky"
|
||||
/>
|
||||
|
||||
<ContentSidebar>
|
||||
|
||||
<TableOfContents slot="side-left" />
|
||||
|
||||
<div slot="main">
|
||||
|
||||
<p>This one's more of a heartbeat update rather than a progress display.</p>
|
||||
|
||||
<h2 id="update">Update on the Progress Pause</h2>
|
||||
|
||||
<p>What's become apparent through the infrequency of devlog updates is that I've slowed development recently. I've had to prepare for an abroad semester that starts in September, and I've also been busy writing a bachelor's thesis on school participation in the city – titled <i>"The School as a Neighbourhood Actor"</i>.</p>
|
||||
|
||||
<p>The good news is that I'm done with all of this! The bachelor's thesis in particular robbed me of quite a lot of time, though I managed to power through in the week before submission. I finally submitted it on Monday and only have a colloquium left to pass, though since I only need to prepare a short presentation for this, it won't take nearly as much time away from my creative projects.</p>
|
||||
|
||||
<h2 id="play">Play Project N5 (old)</h2>
|
||||
|
||||
<p>I decided to upload some playable builds of <b>Project N5</b>! Now that the website is running on my own server instead of being hosted by GitHub or Codeberg, I have a lot more freedom here.</p>
|
||||
|
||||
<p>The game, in its state from 2025-05-16 (before the reboot), is available to play in-browser <a href="https://apps.denizk0461.dev/projectn5">right here!</a> It's not a terribly great experience, though. Loading times are significantly longer and shader compilation regularly freezes the game for longer than in a locally-saved copy. Some shaders are also not functioning as intended, though this only has a minor visual impact. The game was never optimised to work on the web, after all.</p>
|
||||
|
||||
<p>I've also uploaded old builds of the game <a href="https://files.denizk0461.dev/projectn5">here</a>. You'll find the following builds, one for each protagonist:</p>
|
||||
|
||||
<LinkList entries={builds} />
|
||||
|
||||
<p>The 2025-08-16 build has not seen work put into it after <a href="/projects/projectn5/devlog/2025/0523/">2025-05-16</a>, bar the build notice on the pause screen.</p>
|
||||
|
||||
<h2 id="next">What's Next</h2>
|
||||
|
||||
<p>More will follow soon!</p>
|
||||
|
||||
<p>Now that my bachelor's thesis is a thing of the past, I have much more free time to work on this game, and I want to <i>use</i> it. Starting Monday, I've told myself, I'll work on the game <i>every day!</i> I'm hoping this will not only yield more progress, but also that I'll be able to establish a routine, which will remove the requirement of random motivation to get things done.</p>
|
||||
|
||||
<p>Laura's 3D model is progressing well, for example, and I cannot wait to texture and animate her!</p>
|
||||
|
||||
</div>
|
||||
</ContentSidebar>
|
||||
@@ -1,117 +0,0 @@
|
||||
<script lang="ts">
|
||||
import BannerTitleAlt from "$lib/banner-title-alt.svelte";
|
||||
import ContentSidebar from "$lib/content-sidebar.svelte";
|
||||
import SeparatorLine from "$lib/separator-line.svelte";
|
||||
import TableOfContents from "$lib/table-of-contents.svelte";
|
||||
import Video from "$lib/video.svelte";
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>She's Here | denizk0461</title>
|
||||
</svelte:head>
|
||||
|
||||
<BannerTitleAlt
|
||||
title="She's Here"
|
||||
subtitle="Project N5 Devlog"
|
||||
date="2025-10-11"
|
||||
banner="../../previews/2025/1011.webp"
|
||||
bannerAlt="Laura idle posing"
|
||||
/>
|
||||
|
||||
<ContentSidebar>
|
||||
|
||||
<TableOfContents slot="side-left" />
|
||||
|
||||
<div slot="main">
|
||||
|
||||
<h2 id="alive">She's Alive!</h2>
|
||||
|
||||
<p>Hi. I finally put Laura into my game. Here she is:</p>
|
||||
|
||||
<Video src="walking.webm" />
|
||||
|
||||
<p>I mostly finished modelling her around two weeks ago, though I've been making constant adjustments while texturing and rigging her. In fact, I made a larger change just two days ago I believe, when I edited the topology around her hips to get better bends in that area.</p>
|
||||
|
||||
<p>I also removed the outline shader here, because it kind of clashed with the model – her eyes were completely black, for example. I'll have to see whether I re-introduce an outline shader. I couldn't really get it to look nice with Godot 4.5's new stencil buffer, though I still think the feature is very cool.</p>
|
||||
|
||||
<h3 id="rig">Her Rig</h3>
|
||||
|
||||
<img src="fullbody.webp" alt="Laura's 3D model including her skeleton rig. On the left is a look from the front, on the right is a look from the side.">
|
||||
|
||||
<p>Unlike last time, I decided against using an auto-rigging tool and instead manually created Laura's rig. Several reasons:</p>
|
||||
|
||||
<p>Setting up a rig using an auto-rigging tool often means creating a very complicated rig. The rig created for v1 Laura using Rigify yielded many hundreds of bones; deformation bones, organisation bones, control bones, IK, FK, literally everything you could imagine. I, quite frankly, do not need most of this. Creating a rig manually meant that I could focus on the things I needed, nothing more, nothing less. Plus, creating it myself meant that I actually understood what was going on and had to justify every single bone. This yielded a rig that's more efficient and <i>much</i> more manageable.</p>
|
||||
|
||||
<p>It also allowed me to add extra bones much more easily. I'm aware that it's possible to add bones to a Rigify rig, but as far as I know, this requires writing Python code, and while I know Python, I know absolutely nothing about Blender scripting. In my rig, adding more bones was as easy as... just adding more bones. This was particularly helpful for the zipper, hood, earrings, and her hair. Likewise, I could omit any bones I <i>didn't</i> need. Therefore, Laura has no facial bones except for her eyes – something that I think is not easily doable using Rigify (you need to keep or delete <i>all</i> face bones at once).</p>
|
||||
|
||||
<p>I also had more creative liberty over creating controls. So far, I've only added a pivot control shape for the root bone (the circles at the hips), but I might add more.</p>
|
||||
|
||||
<p>...that's all for Rigify vs. manual rigs.</p>
|
||||
|
||||
<p>The model is mostly FK, except for the hands and legs, which are controlled using IK. Extra bones near the knees and elbows serve as pointing targets. For simplicity (and because I don't yet know how I could even do this), I don't have any IK/FK switching mechanic implemented. I don't think it'll be necessary, though.</p>
|
||||
|
||||
<p>I'm honestly quite happy with this!</p>
|
||||
|
||||
<h3 id="hair">Her Hair</h3>
|
||||
|
||||
<p>The transition to ponytail hair is done! It also allowed for a hair tie as an extra accessory.</p>
|
||||
|
||||
<p>I've even added some (not quite finished) hair and hood physics using <code>SpringBoneSimulator3D</code>. Compared to Laura's v1 model, this one has many more bones in the hair, so that it can animate smoother. The ponytail is also – as I had expected – much easier to animate properly than flat hair, since it doesn't need to collide with her shoulders and deform appropriately (for which I'd have needed many more bones). Compare the rigs between the old model (left) and the new (right):</p>
|
||||
|
||||
<img src="hair-rigs.webp" alt="Comparison between Laura's skeletons. On the left is her old model with few bones controlling her hair. On the right is her new model with significantly more bones controlling her hair.">
|
||||
|
||||
<h3 id="uvs">UVs</h3>
|
||||
|
||||
<p>I decided to split Laura's textures into four UV groups:</p>
|
||||
|
||||
<ul class="styled-list">
|
||||
<li>skin</li>
|
||||
<li>hair</li>
|
||||
<li>hoodie and hair accessories</li>
|
||||
<li>other clothing and prosthetic arm</li>
|
||||
<li>mask glow highlight</li>
|
||||
</ul>
|
||||
|
||||
<p>The glow highlight is for overdriving the albedo separately from the rest of the model.</p>
|
||||
|
||||
<h3 id="rightarm">Right Arm Prosthetic</h3>
|
||||
|
||||
<p>I decided on a relatively simple prosthetic design now. I also changed the colour to white because it honestly just looked a lot nicer than the grey I'd used before. With the toon shader, I don't think a metallic or reflective look would really be possible anyway.</p>
|
||||
|
||||
<p>While modelling her right hand, I also had an idea: instead of creating a second hand from scratch, why not take her left hand and edit that? Doing this meant that the hands don't look drastically different from one another – as in, they look different, but they still look as if they belong to the same character. It'll also make rigging and animating much easier if both sides are similar. That way, I was able to symmetrise the rig and I'll thus be able to mirror poses!</p>
|
||||
|
||||
<img src="ok.webp" alt="Prosthetic hand making an 'ok' sign.">
|
||||
|
||||
<h2 id="next">What's Next?</h2>
|
||||
|
||||
<h3>More Animations</h3>
|
||||
|
||||
<p>So far, the only animations available are the bind pose (A-pose) and the idle pose. I plan to make many more, of course, and I've been having quite a lot of fun already posing Laura.</p>
|
||||
|
||||
<p>It's quite easy in Godot to put animations together – and quite fun too, I think. You can blend multiple animations together, and you can also use <code>AnimationNodeStateMachine</code> to define logic for switching between animations. It's quite cool!</p>
|
||||
|
||||
<a href="https://janeremover.bandcamp.com/track/your-clothes-2"><h3 id="clothes">your clothes</h3></a>
|
||||
|
||||
<p>What might be BLATANTLY obvious is the unfinished texturing on her trousers. They are still missing some details, though I figured that's a problem so minor that I can just fix it down the road and replace the .png once I've updated it.</p>
|
||||
|
||||
<p>I did, however, make sure to lay out the model UVs in such a way that her hoodie and hair accessories share a texture, which can be hue-shifted with a shader in-game. Has potential for a future cheat code, hehe.</p>
|
||||
|
||||
<h3 id="fixes">Minor Fixes</h3>
|
||||
|
||||
<p>There are some small things I still need to fix. For example, Laura's hair UVs don't yet seem to play quite as nicely with the hair shader as I'd like.</p>
|
||||
|
||||
<p>I may also have to make some adjustments to the zipper, since I currently cannot get <code>SpringBoneSimulator3D</code> to animate it. I'll have to see whether this is a configuration error or if I need more bones to use it.</p>
|
||||
|
||||
<h3 id="afterwards">...and then?</h3>
|
||||
|
||||
<p>Well, I've not really thought this far ahead. I've been working on Laura for so long – since November of last year, remember! – that I've mostly focussed on finishing that. I guess my next step is to animate her and make the animations work in-game. As for where I'm taking the game next; I have rough ideas but I'm not quite sure which steps to take next, exactly.</p>
|
||||
|
||||
<p>What's a bit annoying is that I'm currently doing an abroad semester, which means that I'm not home and cannot access my usual equipment. I have my laptop and a good mouse with me, but I'm missing my monitor setup – working off a single 14-inch screen is admittedly a bit strenuous, since tools like Blender and Godot split up their workspaces into panels, which quickly become crammed. I've noticed this most when animating in Blender.</p>
|
||||
|
||||
<p>I'm considering taking some days to bury myself in the depths of the university library here to animate. They have 34-inch screens available to use with personal laptops.</p>
|
||||
|
||||
<SeparatorLine noMargin={false} />
|
||||
|
||||
<p>I've been quite enjoying working on this game recently and I've been making good progress to. In the past three weeks, I've made progress almost every single day! I'm hoping to keep this up.</p>
|
||||
</div>
|
||||
</ContentSidebar>
|
||||
@@ -1,92 +0,0 @@
|
||||
<script lang="ts">
|
||||
import BannerTitleAlt from "$lib/banner-title-alt.svelte";
|
||||
import ContentSidebar from "$lib/content-sidebar.svelte";
|
||||
import TableOfContents from "$lib/table-of-contents.svelte";
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>Growing Pains | denizk0461</title>
|
||||
</svelte:head>
|
||||
|
||||
<BannerTitleAlt
|
||||
title="Growing Pains"
|
||||
subtitle="Project N5 Devlog"
|
||||
date="2025-10-22"
|
||||
banner="../../previews/2025/1022.webp"
|
||||
bannerAlt="Close-up of Laura blinking"
|
||||
/>
|
||||
|
||||
<ContentSidebar>
|
||||
|
||||
<TableOfContents slot="side-left" />
|
||||
|
||||
<div slot="main">
|
||||
|
||||
<p>I realise there's still a lot of comparing between the old and the new in this update, but I promise there'll be new stuff soon... hopefully. Right now, I just want to go over the improvements I made, because creating Laura has been a huge learning process for me and I honestly think it's been quite successful, which I'm really happy about.</p>
|
||||
|
||||
<h2 id="animation">Animation</h2>
|
||||
|
||||
<p>...is tough. I've never animated a character before. I get how to do it mechanically, within Blender, but it's hard to nail natural movement. I've dabbled in walking and running cycles so far, and they do look like the action they're supposed to represent, but just not quite like what I'm aiming for. There are also issues with things like the speed and, as a consequence, foot sliding. Growing pains, I guess.</p>
|
||||
|
||||
<img src="running.webp" alt="Laura running in Blender. Curves represent the paths her hands and feet move in during the animation.">
|
||||
|
||||
<h2 id="model">Model Changes</h2>
|
||||
|
||||
<h3 id="blinking">Blinking</h3>
|
||||
|
||||
<p>Something that was quite easy to improve was Laura's blinking. In her old model, the topology around her eyes was bad, which led to some nasty stretching:</p>
|
||||
|
||||
<img src="eyelid-stretch.webp" alt="Laura's old model with her eyes closed. The eyelids have a dark gradient on them because of the mesh stretching in this area.">
|
||||
|
||||
<p>I fixed this by adding a separate eyelid mesh, which was recessed into her head while her eyes were open, and stretched from the top of her eyes to the bottom when she blinked. I figured the toon shader I intended to use would hide it, and it kind of did. Still, it didn't look great because her eyes shut from the top only, which is unnatural. Plus, she only had eyelashes on her top eyelid, so making a bottom eyelid would have looked a bit odd. I made the flat eyelashes move and rotate with the eyelid, but it didn't look great either. They clipped into the mask, and the flat plane visually disappeared around the halfway point. Observe on the left, and compare to the new one on the right:</p>
|
||||
|
||||
<div class="horizontally-centre-aligned">
|
||||
<img src="blink-old.webp" alt="Laura's old model blinking. Only the upper eyelid moves, and the eyelashes are a flat plane.">
|
||||
<img src="blink-new.webp" alt="Laura's new model blinking. The eyes now close with both upper and lower eyelids, and the eyelashes are 3D.">
|
||||
</div>
|
||||
|
||||
<p>The way I set up the new mesh allows for stretching the eyelids without affecting the rest of the mesh in any harmful way. Hardly any stretching artifacts to speak of! Thus, I was easily able to make both the upper and the lower eyelids move. And because her eyelashes now wrap around her eye, they close up during the animation, which I think looks super fancy:</p>
|
||||
|
||||
<img src="blink-paused-new.webp" alt="Laura's new model with her eyes closed.">
|
||||
|
||||
<p>Her eyelashes now look <i>so damn good</i> when closed. Maybe not perfect but I'm VERY happy with the result.</p>
|
||||
|
||||
<h3 id="texturing">Texturing</h3>
|
||||
|
||||
<p>I took the liberty to refine her textures a little bit. I didn't add a lot, but I went over a few things:</p>
|
||||
|
||||
<ul class="styled-list">
|
||||
<li>the trousers are a shade darker</li>
|
||||
<li>the hoodie now has a black V-shape across the chest and back</li>
|
||||
<li>the shoes are now white with black accents</li>
|
||||
</ul>
|
||||
|
||||
<p>I still need to add some texturing detail to the trousers and hoodie, like seams. I think they're needed to push the model just a little bit further. I'm just worried whether or not I can actually make it look good. I guess I just need to try to get practice though.</p>
|
||||
|
||||
<div class="horizontally-centre-aligned">
|
||||
<img src="hoodie.webp" alt="New hoodie with a V-shaped pattern in black textured on top. There's also a V-shaped belt buckle with a red highlight in the middle beneath.">
|
||||
<img src="shoes.webp" alt="White painted shoes with black bottoms and black lines drawn on them.">
|
||||
</div>
|
||||
|
||||
<h3 id="misc">More Changes</h3>
|
||||
|
||||
<p>I also edited the model slightly by changing the shape of the trouser legs near the shoes and modifying the topology around the hips for better leg bends. The hood now doesn't bend, but rather bounces as a single unit; I disliked the fold it had and the way it looked when Laura moved in-game. I also gave her a belt buckle very similar to what she had in her old model (see picture above). Not sure if I'll keep it, but it might be a neat detail.</p>
|
||||
|
||||
<img src="hoods.webp" alt="Old hood with a fold in it on the left, new hood without the fold on the right">
|
||||
|
||||
<h2 id="story">Storyboarding</h2>
|
||||
|
||||
<p>I'm likely using that term wrong, but I've been trying to refine the story ideas I've had and put them into a string of events. I'm using Obsidian's canvas feature for this, which is really cool. It gets laggy every now and then, but manually deleting cache folders every few months seems to do the trick, for some reason.</p>
|
||||
|
||||
<p>I've been using it to put all my pieces, all my ideas into a central document, and using groups and arrows to create this string of events to turn it into a linear story. It allows me to view the story as a whole and see the gaps and missing pieces.</p>
|
||||
|
||||
<p>Can I just say: this is <i>difficult!</i> I've written stories before, but most of them never received an ending, and some of them didn't even have a proper beginning. And those I <i>have</i> finished, well... there aren't many, and I don't think they were good. In fact, I remember just one finished story I wrote in the span of around an hour for a school project (a film), and I also directed it, did the camerawork, and edited it. It was awful, let's never speak of it again.</p>
|
||||
|
||||
<p>This time will be different! I never said this before in regards to storywriting, so it ought to be true.</p>
|
||||
|
||||
<p>I've also been thinking about the gameplay side of things. I'm thinking that the game should still lean less into the gun-play direction, so I might stick with the two weapons currently implemented – the blaster and the rifle. I'm also considering omitting the levelling mechanic entirely, since there's hardly a point if there's no arsenal to back it up.</p>
|
||||
|
||||
<img src="posing.webp" alt="Laura pointing a placeholder blaster at the camera.">
|
||||
|
||||
</div>
|
||||
</ContentSidebar>
|
||||
55
src/routes/projects/projectn5/devlog/20250816.md
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: Freeing the Past
|
||||
date: '2025-08-16'
|
||||
tag: '20250816'
|
||||
---
|
||||
<script lang="ts">
|
||||
import LinkList, { type LinkEntry } from "$lib/link-list.svelte";
|
||||
|
||||
let builds: LinkEntry[] = [
|
||||
{
|
||||
text: "2023-10-07 (Protagonist #1)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2023-10-07.zip",
|
||||
},
|
||||
{
|
||||
text: "2023-12-23 (Protagonist #2)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2023-12-23.zip",
|
||||
},
|
||||
{
|
||||
text: "2024-03-25 (Protagonist #3 with jump animations)",
|
||||
link: "https://files.denizk0461.dev/projectn5/2024-03-25.zip",
|
||||
},
|
||||
{
|
||||
text: "2025-08-16 (Laura era) [same build as the web version]",
|
||||
link: "https://files.denizk0461.dev/projectn5/2025-08-16.zip",
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
This one's more of a heartbeat update rather than a progress display.
|
||||
|
||||
## Update on the Progress Pause
|
||||
|
||||
What's become apparent through the infrequency of devlog updates is that I've slowed development recently. I've had to prepare for an abroad semester that starts in September, and I've also been busy writing a bachelor's thesis on school participation in the city – titled *"The School as a Neighbourhood Actor"*.
|
||||
|
||||
The good news is that I'm done with all of this! The bachelor's thesis in particular robbed me of quite a lot of time, though I managed to power through in the week before submission. I finally submitted it on Monday and only have a colloquium left to pass, though since I only need to prepare a short presentation for this, it won't take nearly as much time away from my creative projects.
|
||||
|
||||
## Play Project N5 (old)
|
||||
|
||||
I decided to upload some playable builds of **Project N5**! Now that the website is running on my own server instead of being hosted by GitHub or Codeberg, I have a lot more freedom here.
|
||||
|
||||
The game, in its state from 2025-05-16 (before the reboot), is available to play in-browser [right here!](https://apps.denizk0461.dev/projectn5) It's not a terribly great experience, though. Loading times are significantly longer and shader compilation regularly freezes the game for longer than in a locally-saved copy. Some shaders are also not functioning as intended, though this only has a minor visual impact. The game was never optimised to work on the web, after all.
|
||||
|
||||
I've also uploaded old builds of the game [here](https://files.denizk0461.dev/projectn5). You'll find the following builds, one for each protagonist:
|
||||
|
||||
<LinkList entries={builds} />
|
||||
|
||||
The 2025-08-16 build has not seen work put into it after [2025-05-16](/projects/projectn5/devlog/20250523/), bar the build notice on the pause screen.
|
||||
|
||||
## What's Next
|
||||
|
||||
More will follow soon!
|
||||
|
||||
Now that my bachelor's thesis is a thing of the past, I have much more free time to work on this game, and I want to *use* it. Starting Monday, I've told myself, I'll work on the game *every day!* I'm hoping this will not only yield more progress, but also that I'll be able to establish a routine, which will remove the requirement of random motivation to get things done.
|
||||
|
||||
Laura's 3D model is progressing well, for example, and I cannot wait to texture and animate her!
|
||||
96
src/routes/projects/projectn5/devlog/20251011.md
Normal file
@@ -0,0 +1,96 @@
|
||||
---
|
||||
title: She's Here
|
||||
date: '2025-10-11'
|
||||
tag: '20251011'
|
||||
---
|
||||
<script lang="ts">
|
||||
import Video from "$lib/video.svelte";
|
||||
</script>
|
||||
|
||||
## She's Alive!
|
||||
|
||||
Hi. I finally put Laura into my game. Here she is:
|
||||
|
||||
<Video src="walking.webm" />
|
||||
|
||||
I mostly finished modelling her around two weeks ago, though I've been making constant adjustments while texturing and rigging her. In fact, I made a larger change just two days ago I believe, when I edited the topology around her hips to get better bends in that area.
|
||||
|
||||
I also removed the outline shader here, because it kind of clashed with the model – her eyes were completely black, for example. I'll have to see whether I re-introduce an outline shader. I couldn't really get it to look nice with Godot 4.5's new stencil buffer, though I still think the feature is very cool.
|
||||
|
||||
### Her Rig
|
||||
|
||||

|
||||
|
||||
Unlike last time, I decided against using an auto-rigging tool and instead manually created Laura's rig. Several reasons:
|
||||
|
||||
Setting up a rig using an auto-rigging tool often means creating a very complicated rig. The rig created for v1 Laura using Rigify yielded many hundreds of bones; deformation bones, organisation bones, control bones, IK, FK, literally everything you could imagine. I, quite frankly, do not need most of this. Creating a rig manually meant that I could focus on the things I needed, nothing more, nothing less. Plus, creating it myself meant that I actually understood what was going on and had to justify every single bone. This yielded a rig that's more efficient and *much* more manageable.
|
||||
|
||||
It also allowed me to add extra bones much more easily. I'm aware that it's possible to add bones to a Rigify rig, but as far as I know, this requires writing Python code, and while I know Python, I know absolutely nothing about Blender scripting. In my rig, adding more bones was as easy as... just adding more bones. This was particularly helpful for the zipper, hood, earrings, and her hair. Likewise, I could omit any bones I *didn't* need. Therefore, Laura has no facial bones except for her eyes – something that I think is not easily doable using Rigify (you need to keep or delete *all* face bones at once).
|
||||
|
||||
I also had more creative liberty over creating controls. So far, I've only added a pivot control shape for the root bone (the circles at the hips), but I might add more.
|
||||
|
||||
...that's all for Rigify vs. manual rigs.
|
||||
|
||||
The model is mostly FK, except for the hands and legs, which are controlled using IK. Extra bones near the knees and elbows serve as pointing targets. For simplicity (and because I don't yet know how I could even do this), I don't have any IK/FK switching mechanic implemented. I don't think it'll be necessary, though.
|
||||
|
||||
I'm honestly quite happy with this!
|
||||
|
||||
### Her Hair
|
||||
|
||||
The transition to ponytail hair is done! It also allowed for a hair tie as an extra accessory.
|
||||
|
||||
I've even added some (not quite finished) hair and hood physics using `SpringBoneSimulator3D`. Compared to Laura's v1 model, this one has many more bones in the hair, so that it can animate smoother. The ponytail is also – as I had expected – much easier to animate properly than flat hair, since it doesn't need to collide with her shoulders and deform appropriately (for which I'd have needed many more bones). Compare the rigs between the old model (left) and the new (right):
|
||||
|
||||

|
||||
|
||||
### UVs
|
||||
|
||||
I decided to split Laura's textures into four UV groups:
|
||||
|
||||
- skin
|
||||
- hair
|
||||
- hoodie and hair accessories
|
||||
- other clothing and prosthetic arm
|
||||
- mask glow highlight
|
||||
|
||||
The glow highlight is for overdriving the albedo separately from the rest of the model.
|
||||
|
||||
### Right Arm Prosthetic
|
||||
|
||||
I decided on a relatively simple prosthetic design now. I also changed the colour to white because it honestly just looked a lot nicer than the grey I'd used before. With the toon shader, I don't think a metallic or reflective look would really be possible anyway.
|
||||
|
||||
While modelling her right hand, I also had an idea: instead of creating a second hand from scratch, why not take her left hand and edit that? Doing this meant that the hands don't look drastically different from one another – as in, they look different, but they still look as if they belong to the same character. It'll also make rigging and animating much easier if both sides are similar. That way, I was able to symmetrise the rig and I'll thus be able to mirror poses!
|
||||
|
||||

|
||||
|
||||
## What's Next?
|
||||
|
||||
### More Animations
|
||||
|
||||
So far, the only animations available are the bind pose (A-pose) and the idle pose. I plan to make many more, of course, and I've been having quite a lot of fun already posing Laura.
|
||||
|
||||
It's quite easy in Godot to put animations together – and quite fun too, I think. You can blend multiple animations together, and you can also use `AnimationNodeStateMachine` to define logic for switching between animations. It's quite cool!
|
||||
|
||||
### *your clothes*
|
||||
|
||||
What might be BLATANTLY obvious is the unfinished texturing on her trousers. They are still missing some details, though I figured that's a problem so minor that I can just fix it down the road and replace the .png once I've updated it.
|
||||
|
||||
I did, however, make sure to lay out the model UVs in such a way that her hoodie and hair accessories share a texture, which can be hue-shifted with a shader in-game. Has potential for a future cheat code, hehe.
|
||||
|
||||
### Minor Fixes
|
||||
|
||||
There are some small things I still need to fix. For example, Laura's hair UVs don't yet seem to play quite as nicely with the hair shader as I'd like.
|
||||
|
||||
I may also have to make some adjustments to the zipper, since I currently cannot get `SpringBoneSimulator3D` to animate it. I'll have to see whether this is a configuration error or if I need more bones to use it.
|
||||
|
||||
### ...and then?
|
||||
|
||||
Well, I've not really thought this far ahead. I've been working on Laura for so long – since November of last year, remember! – that I've mostly focussed on finishing that. I guess my next step is to animate her and make the animations work in-game. As for where I'm taking the game next; I have rough ideas but I'm not quite sure which steps to take next, exactly.
|
||||
|
||||
What's a bit annoying is that I'm currently doing an abroad semester, which means that I'm not home and cannot access my usual equipment. I have my laptop and a good mouse with me, but I'm missing my monitor setup – working off a single 14-inch screen is admittedly a bit strenuous, since tools like Blender and Godot split up their workspaces into panels, which quickly become crammed. I've noticed this most when animating in Blender.
|
||||
|
||||
I'm considering taking some days to bury myself in the depths of the university library here to animate. They have 34-inch screens available to use with personal laptops.
|
||||
|
||||
...
|
||||
|
||||
I've been quite enjoying working on this game recently and I've been making good progress too. In the past three weeks, I've made progress almost every single day! I'm hoping to keep this up.
|
||||
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |