{"id":1605,"date":"2025-11-08T21:34:47","date_gmt":"2025-11-08T20:34:47","guid":{"rendered":"https:\/\/stuff.tamius.net\/sacred-texts\/?p=1605"},"modified":"2025-11-08T21:36:47","modified_gmt":"2025-11-08T20:36:47","slug":"i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up","status":"publish","type":"post","link":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/","title":{"rendered":"I went on a Vibe-Coding Adventure"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Recently, I was lifting 3D models from video games again. Because the models I&#8217;m interested in character models with their poses preserved as on screen, the extracted models came out squished (because that&#8217;s how computer graphics and Intel GPA suite work). Unsquishing the models isn&#8217;t particularly complex, but the result often isn&#8217;t too exact. I wondered if I could automate that, and the answer was something along the lines of:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>no, because I know very little about linear algebra and computer graphics<\/li>\n\n\n\n<li><em>but <\/em>I have some high-level knowledge and vague ideas of what the program would need to do in order to achieve the goal<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">So I consulted with that famous XKCD automation chart: <br><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"832\" src=\"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/is_it_worth_the_time_2x-1024x832.png\" alt=\"is_it_worth_the_time_2x\" class=\"wp-image-1606\" srcset=\"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/is_it_worth_the_time_2x-1024x832.png 1024w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/is_it_worth_the_time_2x-300x244.png 300w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/is_it_worth_the_time_2x-768x624.png 768w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/is_it_worth_the_time_2x-1052x855.png 1052w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/is_it_worth_the_time_2x.png 1141w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">https:\/\/xkcd.com\/1205\/<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">&#8230; and it told me that automation is only saving me time if I spend somewhere between one day and one hour working on it. This is a problem, because if I wanted to do this task the old fashioned route, I&#8217;d need <em>a lot more <\/em>than that. So I decided instead to go for the Billy Mitchell method, and opt for cheating with ChatGPT.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Concept<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When extracting 3D models from games with Intel GPA, you get access to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>input geometry <\/strong>\u2014 that is, the 3D model the game is using <em>as authored<\/em><\/li>\n\n\n\n<li><strong>output geometry \u2014 <\/strong>that is, the 3D model your GPU is drawing, with all animations and transformations applied to it<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"966\" height=\"623\" src=\"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_0_input_output_geometry.webp\" alt=\"vc_0_input_output_geometry\" class=\"wp-image-1608\" srcset=\"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_0_input_output_geometry.webp 966w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_0_input_output_geometry-300x193.webp 300w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_0_input_output_geometry-768x495.webp 768w\" sizes=\"auto, (max-width: 966px) 100vw, 966px\" \/><figcaption class=\"wp-element-caption\">Input (left) and output (right) geometry. Right is how you see the box when playing the game, left is how your graphics card sees the same box.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Because all objects in a given capture are (presumably) squished by the same amounts, that means I could look at the scene, pick a landmark \u2014 an object without animations and that doesn&#8217;t appear stretched while playing the game \u2014 and export it in both <em>input geometry <\/em>and <em>output geometry <\/em>variants.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The high-level algorithm is thus:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>read <code>.obj<\/code> file and parse it<\/li>\n\n\n\n<li>rotate <em>input geometry <\/em>until it matches the rotation of <em>output geometry<\/em><\/li>\n\n\n\n<li>compare bounding boxes of <em>input <\/em>and <em>output geometry<\/em> and determine the correct scaling factor along each axis<\/li>\n\n\n\n<li>normalize scaling factors so one of the scaling factors (preferably Y) equals to <code>1<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you picked the correct object and if the code works properly, scaling factor for X axis should be equal to your in-game resolution&#8217;s aspect ratio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ChatGPT had very little issues up to this point, but as anyone who did any amount of programming probably knows: scope is an insidious beast that creeps and likes to prepare you ambushes. And wouldn&#8217;t you know: even saying it waited behind the corner would be a bit of an understatement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The First Round of Improvements<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The obvious question is: if we can calculate how much we need to stretch our character &#8230; then why don&#8217;t we take our landmark&#8217;s input geometry, export both our landmark <em>and<\/em> our character as our output geometry, and automatically scale our character?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That doesn&#8217;t sound too hard, but then you remember that you probably don&#8217;t want your landmark in your 3D model. You only want your character, so you have to find a way to remove the landmark from your character. We also need to know which parts of our <em>output geometry <\/em>are landmarks and which one aren&#8217;t, because our character needs to be ignored by the code that calculates the scaling factors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is problematic, because geometry exported from Intel GPA doesn&#8217;t consist of meshes \u2014 you get a bunch of loose triangles that don&#8217;t actually share any vertices. Which means that if you want to identify and remove the landmark, you first have to connect those loose triangles into connected meshes. This can be achieved by deduplicating vertices: if there are two vertices in the same spot, merging them into one will also connect loose triangles into contiguous meshes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In short, our plan is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>deduplicate vertices, converting pile of loose triangles into contiguous meshes<\/li>\n\n\n\n<li>split said meshes into distinct objects<\/li>\n\n\n\n<li>find our landmark in output geometry,<\/li>\n\n\n\n<li>calculate correction factors and apply them<\/li>\n\n\n\n<li>export objects back into an <code>.obj<\/code> file <\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">So what&#8217;s the problem?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Well, there are several. In <code>.obj<\/code>, 3D models are defined by two lists: list of all vertices and list of all faces. In those two lists, vertex is a line with three positions in space. Face is a line of text that basically says &#8220;this triangle connects first, second, and third vertex&#8221;. When you split meshes into distinct objects, you&#8217;re basically splitting this one giant list into lots of smaller lists. This means that numbers of each vertex change, and you need to account for that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The second problem is that when working with <code>.obj<\/code> files, first vertex is &#8220;vertex 1&#8221;.  However, in most programming languages, the first element in a list is &#8220;element 0.&#8221; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The third problem is the second problem in reverse: when you&#8217;re exporting geometry back to <code>.obj<\/code>, you need to re-number the vertices again \u2014 <em>especially <\/em>if you removed your landmark object.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ChatGPT was very well aware of this. I know because it explained it to me before writing its functions. But did ChatGPT account for that when it wrote its code?<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"732\" src=\"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues-1024x732.webp\" alt=\"vc_1_export-issues\" class=\"wp-image-1607\" srcset=\"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues-1024x732.webp 1024w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues-300x215.webp 300w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues-768x549.webp 768w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues-1140x815.webp 1140w, https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues.webp 1460w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Quick illustration of what I&#8217;m talking about.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">It took quite some prompting to get ChatGPT to fix the issue, but eventually it did&#8230; it just had to be constantly reminded about the distinction between 0-based and 1-based things.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Second round of improvements<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When it comes to 3D models, triangles have a front side and a back side. It is rather important that triangles face in the correct direction. Which way is considered correct depends and varies from game to game, from program to program, from game engine to game engine, and from graphics framework to graphics framework. When extracting 3D models from video games with Intel GPA suite, you can therefore end with situations where triangles of the models you extracted from the game will face in the wrong direction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I wanted to detect that. The idea was:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>draw model onto a canvas<\/li>\n\n\n\n<li>color triangles facing towards the camera with orange, and triangles facing away from the camera with red<\/li>\n\n\n\n<li>read image data from the canvas<\/li>\n\n\n\n<li>if the canvas has more red than orange, then I know that triangles need to be flipped<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The prompt was pretty much this. ChatGPT came up with code that rendered something &#8230; however, rendered models were not rendered correctly, no matter how much I prodded in the prompts: they were always a mix of orange and red, even when I knew they should be either completely red or completely orange. Eventually, the &#8220;render preview&#8221; problem was solved by telling ChatGPT to draw the model twice \u2014 once in original orientation, with orange; and once with all triangles flipped, in red.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For determining whether objects&#8217; normals are flipped or not I decided to abandon the &#8220;figure it out by looking at the image approach&#8221; and told chatGPT to find a different way to do it, and it did. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">While ultimately chatGPT managed to give something that worked, one thing was becoming very apparent: if you try vibe-coding with zero knowledge about the thing you want to code, ChatGPT won&#8217;t save you. You still need to know what you&#8217;re doing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Third round of improvements<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The other day, I used the program in order to fix a model I extracted from a game.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">3D models for 3D printing must not contain any holes in the mesh, which means that you have to ensure your model is manifold, watertight, and contains no sheets. If there are any holes (<em>edge loops<\/em>, actually), you need to fill them. And after a very boring evening of filling those gaps manually, I asked myself: <em>surely I could prompt ChatGPT into writing me a function or something that does that for me in less time than it took me to fill those holes.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also wanted it to sort the meshes that make up in object into several categories based on whether any edge-loops were auto-filled, whether auto-fill failed, whether final object is manifold, and whether final object contains any self-intersecting triangles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That was &#8230; a bit of a challenge. Initially, algorithm written by ChatGPT would either fail to fill edge loops, or it would corrupt the model entirely, to the point I had to revert the changes and start over. On the second attempt, ChatGPT did fill the holes without fucking up the export \u2014 but the normals of the newly added faces were oriented incorrectly. How did ChatGPT try to fix that? By adding shit ton of complex functions (though admittedly, I did tell it to not use any external libraries). It explained that it determined correct triangle orientation based on whether triangle was angled towards or away from the object&#8217;s center, or something like that.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Correct answer for getting face orientation on the newly added faces right is to copy vertex winding from the neighbouring triangle \u2014 that is, if neightbouring triangle&#8217;s vertices are defined in clockwise order, you also need to list vertices of your newly added triangle in clockwise order. If you don&#8217;t, the new triangle will face the wrong way. And I had to point that out.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The point about &#8220;you need to have at least moderate technical understanding of your problem if you want ChatGPT to give you a solution&#8221; is making its appearance once again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But that&#8217;s where ChatGPT success finally ends. Last task I had for it was: check if object has any self-intersections. ChatGPT provided M\u00f6ller&#8217;s test (or so it said) \u2014 but there was a bit of a problem: it was detecting intersections where there weren&#8217;t any, and no amount of prompting would make it fix its code. Which meant that I needed to implement that triangle check the good ol&#8217; fashion way: go to stackoverflow, find someone who encountered the same problem as you, and borrow their solution. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But with that, I think my little model fixing tool has all the features I want. So what&#8217;s some takeaways from this experience?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The pros<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You don&#8217;t have to learn about your problem \/ you don&#8217;t have to have low-level knowledge about your problem.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I must say \u2014 if I had to learn about computer graphics in order to write this problem, this experience wouldn&#8217;t be a few-days project for me. It would take at least a month or two.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You can get the solution pretty quickly<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See the previous point about &#8220;it would take a month or two.&#8221; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You don&#8217;t have to think a lot<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The cons<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You don&#8217;t have to learn about your problem \/ you don&#8217;t have to have low-level knowledge about your problem.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When working on Ultrawidify, I feel like I was forced to learn at least a few of those things. With this project, I don&#8217;t feel like I learned anything. Because I didn&#8217;t learn a thing, I also didn&#8217;t <em>really <\/em>understand the code ChatGPT spat at me. Which means that if there was a problem with the code, I kinda had to rely on ChatGPT finding me a fix, and fixing the code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And honestly \u2014 that kinda feels bad. I don&#8217;t ever feeling bad because I was lazy before.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>You don&#8217;t have to think a lot<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Most of the time, at least. Just like physical exercise is good for your body, having to do the thinking is good for your brain. Thinking is a lot of &#8220;use it or lose it&#8221; kind of thing, and outsourcing your thinking to an AI is probably <em>not too great of an idea.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>But you do need to give ChatGPT a relatively specific instructions, otherwise you&#8217;ll get garbage<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is why I don&#8217;t quite fear for my job security &#8230; yet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ChatGPT gives you spaghetti<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I don&#8217;t feel that the code I got from ChatGPT is particularly maintainable. While spaghetti code is fine for small projects, in a real, large project that will need to be maintained for a long time? <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">&#8212;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But ultimately, I feel that despite all the cons, the chatGPT was still <em>too <\/em>useful. When ChatGPT is good enough to outsource your thinking to, people are going to do that. And when people start to outsource their thinking to ChatGPT, that means they&#8217;ll think less \u2014 and, therefore, also learn and know less. Which is probably not the best direction. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This isn&#8217;t to say &#8220;chatGPT bad&#8221;, because it&#8217;s pretty useful piece of tech (if you know how to use it) &#8230; just maybe don&#8217;t use it to do all your homework.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently, I was lifting 3D models from video games again. Because the models I&#8217;m interested in character models with their poses preserved as on screen, the extracted models came out squished (because that&#8217;s how computer graphics and Intel GPA suite work). Unsquishing the models isn&#8217;t particularly complex, but the result often isn&#8217;t too exact. I wondered if I could automate that, and the answer<span class=\"more-dots\">&#8230;<\/span> <span class=\"more-tag d-block mt-05\"><a class=\"more-link\" href=\"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/\">Continue Reading...<span class=\"screen-reader-text\"> \"I went on a Vibe-Coding Adventure\"<\/span><\/a><\/span><!-- .more-tag --><\/p>\n","protected":false},"author":1,"featured_media":1607,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[54],"tags":[],"class_list":["post-1605","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>I went on a Vibe-Coding Adventure - Tamius&#039; sacred texts<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"I went on a Vibe-Coding Adventure - Tamius&#039; sacred texts\" \/>\n<meta property=\"og:description\" content=\"Recently, I was lifting 3D models from video games again. Because the models I&#8217;m interested in character models with their poses preserved as on screen, the extracted models came out squished (because that&#8217;s how computer graphics and Intel GPA suite work). Unsquishing the models isn&#8217;t particularly complex, but the result often isn&#8217;t too exact. I wondered if I could automate that, and the answer...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/\" \/>\n<meta property=\"og:site_name\" content=\"Tamius&#039; sacred texts\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-08T20:34:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-08T20:36:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"1044\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Tamius Han\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tamius Han\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/\"},\"author\":{\"name\":\"Tamius Han\",\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/#\\\/schema\\\/person\\\/4677d05a4f45974f27cd21481c561c21\"},\"headline\":\"I went on a Vibe-Coding Adventure\",\"datePublished\":\"2025-11-08T20:34:47+00:00\",\"dateModified\":\"2025-11-08T20:36:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/\"},\"wordCount\":2103,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/vc_1_export-issues.webp\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/\",\"url\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/\",\"name\":\"I went on a Vibe-Coding Adventure - Tamius&#039; sacred texts\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/vc_1_export-issues.webp\",\"datePublished\":\"2025-11-08T20:34:47+00:00\",\"dateModified\":\"2025-11-08T20:36:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/#\\\/schema\\\/person\\\/4677d05a4f45974f27cd21481c561c21\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#primaryimage\",\"url\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/vc_1_export-issues.webp\",\"contentUrl\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/vc_1_export-issues.webp\",\"width\":1460,\"height\":1044,\"caption\":\"vc_1_export-issues\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/2025\\\/11\\\/08\\\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"I went on a Vibe-Coding Adventure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/#website\",\"url\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/\",\"name\":\"Tamius&#039; sacred texts\",\"description\":\"... containing one of the weirdest mix of pointless topics.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/#\\\/schema\\\/person\\\/4677d05a4f45974f27cd21481c561c21\",\"name\":\"Tamius Han\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1ce12569905c4aff5d48778af8527565f1175c254ad56cc5e5221666ff1e222b?s=96&d=blank&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1ce12569905c4aff5d48778af8527565f1175c254ad56cc5e5221666ff1e222b?s=96&d=blank&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1ce12569905c4aff5d48778af8527565f1175c254ad56cc5e5221666ff1e222b?s=96&d=blank&r=pg\",\"caption\":\"Tamius Han\"},\"url\":\"https:\\\/\\\/stuff.tamius.net\\\/sacred-texts\\\/author\\\/tamius-han\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"I went on a Vibe-Coding Adventure - Tamius&#039; sacred texts","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/","og_locale":"en_US","og_type":"article","og_title":"I went on a Vibe-Coding Adventure - Tamius&#039; sacred texts","og_description":"Recently, I was lifting 3D models from video games again. Because the models I&#8217;m interested in character models with their poses preserved as on screen, the extracted models came out squished (because that&#8217;s how computer graphics and Intel GPA suite work). Unsquishing the models isn&#8217;t particularly complex, but the result often isn&#8217;t too exact. I wondered if I could automate that, and the answer...","og_url":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/","og_site_name":"Tamius&#039; sacred texts","article_published_time":"2025-11-08T20:34:47+00:00","article_modified_time":"2025-11-08T20:36:47+00:00","og_image":[{"width":1460,"height":1044,"url":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues.webp","type":"image\/webp"}],"author":"Tamius Han","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Tamius Han","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#article","isPartOf":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/"},"author":{"name":"Tamius Han","@id":"https:\/\/stuff.tamius.net\/sacred-texts\/#\/schema\/person\/4677d05a4f45974f27cd21481c561c21"},"headline":"I went on a Vibe-Coding Adventure","datePublished":"2025-11-08T20:34:47+00:00","dateModified":"2025-11-08T20:36:47+00:00","mainEntityOfPage":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/"},"wordCount":2103,"commentCount":0,"image":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#primaryimage"},"thumbnailUrl":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues.webp","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/","url":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/","name":"I went on a Vibe-Coding Adventure - Tamius&#039; sacred texts","isPartOf":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/#website"},"primaryImageOfPage":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#primaryimage"},"image":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#primaryimage"},"thumbnailUrl":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues.webp","datePublished":"2025-11-08T20:34:47+00:00","dateModified":"2025-11-08T20:36:47+00:00","author":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/#\/schema\/person\/4677d05a4f45974f27cd21481c561c21"},"breadcrumb":{"@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#primaryimage","url":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues.webp","contentUrl":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-content\/uploads\/2025\/11\/vc_1_export-issues.webp","width":1460,"height":1044,"caption":"vc_1_export-issues"},{"@type":"BreadcrumbList","@id":"https:\/\/stuff.tamius.net\/sacred-texts\/2025\/11\/08\/i-went-on-a-vibe-coding-adventure-heres-what-i-picked-up\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/stuff.tamius.net\/sacred-texts\/"},{"@type":"ListItem","position":2,"name":"I went on a Vibe-Coding Adventure"}]},{"@type":"WebSite","@id":"https:\/\/stuff.tamius.net\/sacred-texts\/#website","url":"https:\/\/stuff.tamius.net\/sacred-texts\/","name":"Tamius&#039; sacred texts","description":"... containing one of the weirdest mix of pointless topics.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/stuff.tamius.net\/sacred-texts\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/stuff.tamius.net\/sacred-texts\/#\/schema\/person\/4677d05a4f45974f27cd21481c561c21","name":"Tamius Han","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/1ce12569905c4aff5d48778af8527565f1175c254ad56cc5e5221666ff1e222b?s=96&d=blank&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/1ce12569905c4aff5d48778af8527565f1175c254ad56cc5e5221666ff1e222b?s=96&d=blank&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1ce12569905c4aff5d48778af8527565f1175c254ad56cc5e5221666ff1e222b?s=96&d=blank&r=pg","caption":"Tamius Han"},"url":"https:\/\/stuff.tamius.net\/sacred-texts\/author\/tamius-han\/"}]}},"_links":{"self":[{"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/posts\/1605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/comments?post=1605"}],"version-history":[{"count":2,"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/posts\/1605\/revisions"}],"predecessor-version":[{"id":1614,"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/posts\/1605\/revisions\/1614"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/media\/1607"}],"wp:attachment":[{"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/media?parent=1605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/categories?post=1605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/stuff.tamius.net\/sacred-texts\/wp-json\/wp\/v2\/tags?post=1605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}