Log #23: Jan/16/2025

  • A Demo Mapped Out
  • Monitoring the Mind
  • Design Documentation Epiphany

I did some good work on our game's Demo level map. Now it's in a state where it feels decently complete, and I will plan to move on to working on the game's next levels. It took time to set up some of the pieces that I can copy paste, and I wish I made better use of Unreal Engine's grid snapping when laying assets out, but all in all, I think it's pretty good. It's inspiring when the team likes what I've done. Can't wait to work on the second level!!

One of our team's artists did some awesome work on a "mind monitor machine" model. They then made a very nice animation for it, which one of our programmers implemented this week. Seeing all of this work come together is very nice.

All of us designers got together and began reviewing two kids' design documentation. And wow. It was fun to read, yet also explanatory. They had two of their in-game characters explaining parts of the game, which not only helped make it more fun to read, but it also gave you an increased understanding of the game's mood.

To be honest, I have neglected my own game's design documentation because people haven't been making the most use of it, and I don't have organized in a helpful manner. Of course, the typical format that we've been learning all this time makes way more sense, and would be better than whatever it is I've done. I've hid from the documentation, but I should have asked for help, and used the default format. Wow wow wow, wow wow.

Why do I run from my problems when I could run at them?

MATH SEGMENT: Geometry Added Jan-17

As mentioned above, I have a pass of our game's first level (the demo map) that could work as "complete enough."

To build the final area, I made a large cafeteria-like area with "coves" along the walls. To give it a stranger, more "liminal" feel, I made the room extend unusually long.

As you can see, the cafe area goes back pretty far.

One somewhat interesting thing I've been running into (since I've started doing level design) is when you rotate an rectangular object from an origin at one of its corners. The locations of actors in Unreal Engine are measured at a point, and so if you rotate an actor, you're spinning it about that actor's origin point (the point that is where the location is measured from).

This means that when you rotate, say, a cube, 180°, you need to make sure that the cube doesn't appear shifted over. The rotation could end up with the depth of the cube on the opposite side of the point that you want, so you might need to adjust the cube's position in order to rotate it properly. I've ran into this a lot when rotating walls and things: I'll twist a wall 180° and find I need to offset it's location slightly because the depth of the wall is on the "wrong" side of its origin.

All of the above cubes have the same position on the y-axis (green), but they're rotated different amounts.

The above image illustrates this by showing 5 cubes, all with the same position on the y-axis (green). Because they're being rotated about a corner, the cube ends up in an "offset" position when it's rotated 180°.

I guess the moral of the story is to pay attention to what point an actor's location is be measured from, and to keep in mind how rotation works with that. Interestingly, if the origin was at the cube's center, there would be no "offset"; the cube would "spin in place".

Working on this level, I was also forced to work with more focus on precision. I "chillaxed" some and began measuring less precisely. That bit me in the back a little bit becauase odd seams appeared between adjacent walls. It took taking the time to properly measure a few things to get the clean result I wanted.

Look at that neat stairwell! Ignore the funky shadow that the railing casts...

But now, I can say I have some pride in my work.

MATH SEGMENT: Algebra and Functions Added Jan-17

For this MATH SEGMENT, I am going to talk about a project I was working on this week outside of our game. This week, I finished a python program that generates the tuning measurements for an inputted equal temperment musical tuning. There are still some errors because in some cases I get negative answers (which doesn't make sense), but aside from those, the program seems to work. I'll explain a little bit of what I did.

Breif background information: Traditional "western" music, as well as a lot of pop music, is based around the octave, a measurement relating two pitches whose frequencies are one factor of 2 apart. These octaves are divided into 12 notes, hence why the piano has a pattern of keys that repeats every 12. When someone plays something "out of tune", it often means they're playing notes that do not fit into this 12-notes-per-octave system. This system is called 12-tone equal temperment, or 12edo (12 Equal Divisions of the Octave). However, people don't have to use it. Instead they could play things in 5edo (5 equal divisions of the octave), or even things like 144edo (144 equal divisions of the octave).

The goal of my program is to have users input what interval they want to divide, and by how many steps they want to divide it.

The trickiest part of the program was getting the user input to work. I wanted the user to type in their answers, rather than doing something easier like a drop-down menu. This complicated things. I had to create functions that would check the player input for illegal characters (like random letters), or multiples of characters that shouldn't show up twice (like decimal points). Additionally, I created a system that could interpret fractional input (music intervals are often represented as fractions). I was able to import the fractions module which was great! I even set up a system to replace different methods of writing fractions with the method that the fractions module could work with.

Once I had a way to reliably get input, then I could do the math to calculate the tuning. This turned out to be pretty straightforward.

In order to calculate the equal division of an octave, we first need to know what an octave is in numeric terms. Since the octave is a 2:1 pitch realtionship, we can represent the octave with 2. Because we hear musical relationships based on the relationships of the frequencies (rather than the actual difference in frequency), to find "n" equal divisions of 2, we need to take the nth root of 2. You can imagine the question as asking, "what relationship applied "n" number of times gets me to 2?"

This means that if the player wants to divide a 14:1 interval by 15, we just need to calculat the 15th root of 14. Thankfully for me, python's math module makes it easy.

From here, to print the measures of all of the intervals in that scale, I was able to use a "for loop" to cycle through powers of the answer. If we take the 15th root of 14 again, to get all 15 of the notes between the first note and the octave, we want to also calculate all of the integer powers of the 15th root of 14, until we just calculate 15, which is the last interval of the tuning.

Output of my program in the terminal.

So there you have it! A program that calculates tunings for you! I took it a few steps further, too, by allowing certian combinations of characters to replaced with mathmatical constants (like allowing you to type "pi" to get, well, pi), and allowing fractional divisions of input intervals (which sort of requires an extension of the concept of an "equal temperment"). I'm happy with my work.

Maybe one day I'll figure out how to put it on my website.

Thanks for reading, as always.

-Luke Knotts




Okay, so I don't want my email to be scrapped by bots so I'll explain it to you. First you write my name, but with an 'f', all lowercase. So you get, 'fluke', got it? Okay, then you add an 's', to really make the email say 'flukes', all lowercase still. Then there's a dot, like a, erm, period. You know. Those things we use in writing. After that is the word 'targets', like the things you miss in life. Then there's a 0, or a ZERO, if you prefer it written out. From there it's the typical, '@icloud.com', you know, one of those 'at' signs, but the symbol, and then it's followed by an 'i', the word 'cloud' and then another one of those dot things (.) and 'com', which I think is short for company. So that's my email. Hopefully that helps.