<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: webdva</title>
    <description>The latest articles on Forem by webdva (@webdva).</description>
    <link>https://forem.com/webdva</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F105381%2F34ad5dce-81ec-484f-850f-463da204bf05.jpg</url>
      <title>Forem: webdva</title>
      <link>https://forem.com/webdva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/webdva"/>
    <language>en</language>
    <item>
      <title>Once Proprietary and Private Technology, Now Open and Public</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Fri, 10 Jan 2020 04:19:08 +0000</pubDate>
      <link>https://forem.com/webdva/once-proprietary-and-private-technology-now-open-and-public-31p6</link>
      <guid>https://forem.com/webdva/once-proprietary-and-private-technology-now-open-and-public-31p6</guid>
      <description>&lt;p&gt;I open sourced the 3D multiplayer browser game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/webDva/3d-multiplayer-browser-game"&gt;https://github.com/webDva/3d-multiplayer-browser-game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So if you ever wanted to know what all the internals of the 3D multiplayer browser game I was making looked like, this is your opportunity to see! I guess I'm a real typical startup founder now where I decide to pivot and give away ownership from a failed endeavor. This particular video game product went through many changes, like it was supposed to, but all for the final end and show (a spectacle!) of unfavorable action. For no revenue was obtained—the achievement of revenue, the goal of the business—before the time limit was reached. Nonetheless, the profound technology entrepreneurship experience was essential and it will come in handy in future conquests and successes.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>startup</category>
    </item>
    <item>
      <title>A Resolution for Better Years on Earth</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Mon, 09 Dec 2019 16:19:58 +0000</pubDate>
      <link>https://forem.com/webdva/a-resolution-for-better-years-on-earth-430e</link>
      <guid>https://forem.com/webdva/a-resolution-for-better-years-on-earth-430e</guid>
      <description>&lt;p&gt;An important exposition on a telos to escape the totality of a certain traditional context.&lt;/p&gt;

&lt;p&gt;I declare and assert that a metaphysical halt and reassessment is needed for the &lt;em&gt;Prosperity&lt;/em&gt; program—that the metaphysics of the present process of improving my socioeconomic status is in dire need of careful examination which may cease all current tasks. Specifically, my “&lt;em&gt;What&lt;/em&gt; product should I make?” and my “&lt;em&gt;Who&lt;/em&gt; should be my target market?” were terrible and deficient questions to ask, entailing an ultimately fatal will to truth of common mediocrity. &lt;strong&gt;I was wrong&lt;/strong&gt;, metaphysically. Metaphysically I was, but my reasoning abilities were flawless in the physical realm of things due to my skill and devotion to reason. The foundation of the &lt;em&gt;Prosperity&lt;/em&gt; program’s &lt;em&gt;being&lt;/em&gt; was poorly constructed and inspired by bad and foul desire, a becoming of the world that you should conceive of as being no different from an engineering structure or subject built based on erroneous assumptions. Thus, my noble effort &lt;em&gt;rightfully&lt;/em&gt; came crashing down, as it embarrassingly is, before it could even soar into the sky of great heights. I must bravely admit and reveal that scientism’s feeling of power granted to me (a childish, young, and very naïve me that you could imagine to be here) by its commonly bestowed human and personal identity of being knowledgeable and of having a consistent methodology, influenced and vitalized by the deceptive and betraying persuasion and appearance of the Cartesian &lt;em&gt;Cogito, ergo sum&lt;/em&gt; upon which such dogmatism—one whose asserted propositions and hidden presumptions sustain only a decadent and weak spirited life that starves for any valuable nourishment—is contingent, empowering the human subject’s truths, faiths, and certainties, was a large determining factor of my unfavorable behavior and performance. I apologize to any spectators who may have looked upon me with curious and innocent reverence and for spiritual guidance, for I have failed to achieve a success of acceptable valuation. I promise that next time, as I shall try again, any scientific, engineering, physical, or empirical pursuit will not have its approach, methodology, and strength be developed independently from sound philosophy and metaphysics. Better questions will be asked. More segmentations of understanding and knowledge will be critiqued, with high performing skepticism, and certainties placed under great scrutiny. Paradigms and conceptual frameworks where the dominance of the atomistic subject is cherished and emphasized will be carefully regulated to allow more flexibility in results. Henceforth, reconstruction of all my entrepreneurial activities now begins with a healthy spirit of true and great progress. The &lt;em&gt;Prosperity&lt;/em&gt; program’s objective was to converge to a local optimum, but it would undoubtedly and necessarily be asked “To what, exactly and ultimately?” and “What is the underlying essence of such convergence?” A new perspective is needed where the logical reasoning toward a foundation of existence is actually invalid and never considered at all in the first place. This is for the sake of establishing a future founded on a better foundation.&lt;/p&gt;

</description>
      <category>philosophy</category>
      <category>life</category>
    </item>
    <item>
      <title>Q2 2019 Report</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Sat, 06 Jul 2019 14:56:21 +0000</pubDate>
      <link>https://forem.com/webdva/q2-2019-report-3ea7</link>
      <guid>https://forem.com/webdva/q2-2019-report-3ea7</guid>
      <description>&lt;p&gt;The report for the second quarter of the year 2019.&lt;/p&gt;

&lt;h1&gt;
  
  
  Game Development
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f0kcoZvW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pw2q12sf6s9mc0awwspu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f0kcoZvW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pw2q12sf6s9mc0awwspu.gif" alt="3D multiplayer browser game" title="The latest iteration of the commercial 3D multiplayer browser game." width="880" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I continued developing the commercial 3D multiplayer browser game that was started up in the previous quarter (&lt;a href="https://webdva.github.io/q1-2019-report/"&gt;Q1 2019&lt;/a&gt;) of the year. Some aspects of the game product's creation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I implemented health bars for a 3D game, an achievement to note because of the technicality of displaying a two-dimensional planar object that always faces the viewer/player inside a three-dimensional space. This was made possible in part by the nature of the commendable Babylon.js game development framework (which was used to make the game) and the wealth of resources provided for its use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Similarly, I achieved having visible player names that are displayed above players' heads (identifying them for other players) for a 3D multiplayer game, which is a common requirement for 3D multiplayer games. Also, the player names are randomly generated on the server side.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I achieved having 3D models attached to other 3D models, such as having characters holding weapon items in some manner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I gained experience in using procedural animation for player characters' attacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I prototyped and achieved role-playing game (RPG) classes with stats-based damage calculation and real-time 3D multiplayer action RPG combat.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CNnSOjIt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mxig3oajjjpoa942yq81.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CNnSOjIt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/mxig3oajjjpoa942yq81.gif" alt="Archer class attack" title="An archer class player attacking two warriors and a mage. The mage is defeated quickly due to its weak defense stat." width="880" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I created rudimentary artificial intelligence behavior for nonplayer characters (NPCs) with attacking and aggroing and de-aggroing functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7u--_kTl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0jdjwp7g9vskj8zjnw0d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7u--_kTl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0jdjwp7g9vskj8zjnw0d.gif" alt="NPC attack" title="A player aggroing an NPC and then it attacking the player." width="880" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I achieved and implemented leveling or progression functionality/mechanics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3ZKkTKl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ww8gtc48t4eaxvx3f5lw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3ZKkTKl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ww8gtc48t4eaxvx3f5lw.gif" alt="Level up game mechanic" title="Leveling up mechanic demonstration." width="880" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cancellation
&lt;/h2&gt;

&lt;p&gt;Multiple issues plagued the development of the 3D multiplayer browser game. There was an actual lack of entrepreneur-customer fit: despite my great commitment to players and gamers, I was unable to find a solution that would benefit both of us, me the entrepreneur and players the customers. The monetization of the proposed and budding free-to-play game product warranted great consideration due to the ethical implications of the planned monetization strategy that conflicted with my integrity, my compassion for players.&lt;/p&gt;

&lt;p&gt;As such, the 3D multiplayer browser game has been abandoned in favor of better solutions. Note that no technical problem that arose posed an actual risk to the project's success.&lt;/p&gt;

&lt;p&gt;Do not fret, however. The data, knowledge, lessons learned, experience, documentation, and technology obtained from the 3D multiplayer browser game's development is being converted to utility for the success of a new endeavor. Furthermore, note that it is possible for me to release or even open source the game (with its associated documentation having to be shared along with it) for the purpose of helping to facilitate the spread of free knowledge and technology so that others may benefit. But there is no need to do so.&lt;/p&gt;

&lt;h1&gt;
  
  
  Current Tasks
&lt;/h1&gt;

&lt;p&gt;I recently discovered, thanks in part to my game development experience with Euler angles and quaternions in the previous quarter (&lt;a href="https://webdva.github.io/q1-2019-report/"&gt;Q1 2019&lt;/a&gt;), the utility of abstract or pure mathematics and I am now engaged in a new initiative that involves me learning and studying mathematics, abstract mathematics even, which is often the theory behind the theory, to find from there--as therein lie the secrets of the world, the arcane and mystical arts--an idea with  which to successfully start up a business with the achievement of revenue, however slight the revenue. This has to all be done in less than six months, by the way, before the end of the year 2019, before the start of the next decade.&lt;/p&gt;

&lt;p&gt;I have faith that such an innovative, yet risky, process will work and that it will turn out well in the end for me and I'm eternally committed to ensuring that the favorable end does occur, being responsible for my envisioned success and commanding its arrival.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Future
&lt;/h1&gt;

&lt;p&gt;With the current infrastructure being built and established--because that's what I've been essentially doing this whole time as an entrepreneur with all my "successes" and "failures," "lessons learned," etc.--I'm going to perform great deeds with such utility in my possession.&lt;/p&gt;

&lt;p&gt;One of my ambitions is to give rise to entire new industries and jobs, prosperity for all. That's the kind of entrepreneur I am becoming.&lt;/p&gt;

&lt;p&gt;So it's imperative that my Prosperity program is successful as it will enable me to begin to perform such a large deed, just as the success of the Apollo program of yore proved that the United States and its system of freedom and democracy was more capable than that of its antithesis. May I too converge to a nondominated solution of unprecedented heights, for efforts to change the world can be considered to essentially be multiobjective optimization problems.&lt;/p&gt;

&lt;p&gt;I need only do the right thing, which is to succeed, facilitated by courage, integrity, and strength.&lt;/p&gt;

&lt;p&gt;I do not seek an inconsiderate disruption of anyone or anything. I only wish to engineer a future of prosperity for the world and for myself to diverge from a dominated socioeconomic status. I am prepared to fulfill any role and perform any task that the world requires of me so that this duty may be fulfilled.&lt;/p&gt;

&lt;p&gt;And it appears that I must play the part of the innovator who traverses previously unexplored spaces without a role model to follow or useful literature to refer to, without the aid of anyone else as no one else is able to help me because no one else has experience with such spaces, knowing what is the right thing to do. As such, I must envision--I must create--the future me that will function as that role model and I must create my own literature of success. With these obligations that are of my own volition and design, I effect a self overcoming. This is what I have found myself in, faced with such unprecedented challenges that require equally exceptional courage and strength, as the me of the past when I began this entrepreneurship journey undoubtedly did not expect such responsibility and profoundness.&lt;/p&gt;

&lt;p&gt;Nonetheless, I'm starting up a business and it is a great investment in my future, so I'm fully committed to its success.&lt;/p&gt;

&lt;p&gt;For the sake of the future.&lt;/p&gt;

</description>
      <category>entrepreneurship</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>A new endeavor to reach the next level</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Sat, 22 Jun 2019 22:48:36 +0000</pubDate>
      <link>https://forem.com/webdva/a-new-endeavor-to-reach-the-next-level-430p</link>
      <guid>https://forem.com/webdva/a-new-endeavor-to-reach-the-next-level-430p</guid>
      <description>&lt;p&gt;I find myself on a new endeavor, as the previous one was simply &lt;a href="https://webdva.github.io/entrepreneurs-effectuation/"&gt;the wrong thing to do&lt;/a&gt;, while on my quest to mend the world.&lt;/p&gt;

&lt;p&gt;On the road to success I will have no friend as my duty requires me to banish such things from my life. A duty that is mine alone and no one else's for my ambitions are mine alone and no one else's. In this endeavor, there is only me and these mathematical objects of my study, abstract insentient beings who command the world I seek to conquer.&lt;/p&gt;

&lt;p&gt;This endeavor, where &lt;em&gt;now&lt;/em&gt; the answers I now seek can be found in books, calls for me to find ideas not from the world that my physical form is well acquainted with, the reality that you love so very much and have created a comfortable abode in, but instead, yet another new world whose truths enjoy great sovereignty over our realities. A world whose lands have only been scarcely mapped by the few men and women who dared to survey it.&lt;/p&gt;

&lt;p&gt;It is the world of the advanced sciences' insentient lawgivers and commanders who determine what is exactly what along with the why and the how.&lt;/p&gt;

&lt;p&gt;A world of great power that even &lt;em&gt;you&lt;/em&gt; have a natural instinct toward. Its allure can easily tempt you toward its empty embrace and it ultimately does seduce you, should you decide to answer its beckoning, leaving you at its freezing cold mercy.&lt;/p&gt;

&lt;p&gt;A world that requires the same essential courage that our predecessors had. Their same essential strength.&lt;/p&gt;

&lt;p&gt;A world that I must venture in so that I may extract its utility for my benefit: the success of the Prosperity program before this year ends. A success and goal that is simple: to achieve a nondominated socioeconomic status, a local optimum of prosperity, as having a dominated socioeconomic status is simply unfavorable.&lt;/p&gt;

&lt;p&gt;While learning advanced sciences and mathematics for practical applications, you do not really directly compete with other participants, especially as few dare to venture into this world. You instead only compete with yourself, your past self, for the sake of your future self and at the expense--the suffering--of your present self.&lt;/p&gt;

&lt;p&gt;These are simply the requirements for the success of this endeavor.&lt;/p&gt;

</description>
      <category>entrepreneurship</category>
    </item>
    <item>
      <title>A quick update on the 3D multiplayer browser game's development</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Fri, 17 May 2019 00:39:02 +0000</pubDate>
      <link>https://forem.com/webdva/a-quick-update-on-the-3d-multiplayer-browser-game-s-development-3h68</link>
      <guid>https://forem.com/webdva/a-quick-update-on-the-3d-multiplayer-browser-game-s-development-3h68</guid>
      <description>&lt;p&gt;In addition to doing extensive game design, I've been doing game development as I must perform many tasks myself.&lt;/p&gt;

&lt;h1&gt;
  
  
  Nonplayer characters
&lt;/h1&gt;

&lt;p&gt;I made progress on the main aspects of the nonplayer characters (NPCs), such as how they behave.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qhl1VeKo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0dmhri3f6dv2o605d2l6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qhl1VeKo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/0dmhri3f6dv2o605d2l6.gif" alt="NPC anti-overlap" title="NPCs trying not to be too close together" width="804" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If I keep this up, working on such a thing as NPC behavior, then I'll be able to employ real artificial intelligence (or machine learning) for such a game product. Because, let's not forget that this program, this effort, is an investment in the future and in future capabilities, in addition to its noble goal of facilitating convergence to a local optimum of prosperity before this decade is out.&lt;/p&gt;

&lt;p&gt;The NPCs are, like, &lt;em&gt;really&lt;/em&gt; at the center of this game idea. Even though it's a multiplayer game--and &lt;em&gt;because&lt;/em&gt; it's a multiplayer game with a particular goal which involves having acceptable user retention among others. Let's just say that I don't intend to make the same mistake with such things that developers of multiplayer games often do.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WSuuKWqT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/crh3n3sk8yjk94wp0t7o.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WSuuKWqT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/crh3n3sk8yjk94wp0t7o.gif" alt="NPC attack" title="NPC attack" width="880" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  An archer class and unexpected complexity
&lt;/h1&gt;

&lt;p&gt;I made an archer class to go alongside the warrior and mage classes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2NY4IXkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kuxh5zfdrcnmg7iap5s7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2NY4IXkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kuxh5zfdrcnmg7iap5s7.gif" alt="Archer class attack" title="Archer class attack" width="880" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above screenshot, the archer's attack fails to damage one of the targets. The archer's attack failure may be because of the low update rate of the game combined with the high speed of the archer's projectile attack. And so, high speed attacks are prohibited for the current configuration and design.&lt;/p&gt;

&lt;p&gt;Thanks to this recent experience, I have discovered, firsthand, that the development of a multiplayer game that uses action combat is much more complex, difficult, and expensive than the development of a multiplayer game that uses tab targeting like most MMORPGs. So this game won't be an action RPG game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I2sUmoOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l4cnyqli1ccjxz52v5vk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I2sUmoOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l4cnyqli1ccjxz52v5vk.gif" alt="Level up game mechanic" title="Leveling up mechanic" width="880" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So these recent achievements seem to be prototypes for the final design.&lt;/p&gt;

&lt;h1&gt;
  
  
  An Entity-Component System
&lt;/h1&gt;

&lt;p&gt;When I originally started up this 3D multiplayer game, I chose the specification of forbidding myself from using an Entity-Component System. The reason was that I wanted this game product to be simple enough to not warrant the need for an Entity-Component System.&lt;/p&gt;

&lt;p&gt;But here I am, creating such a thing, which was unexpected.&lt;/p&gt;

&lt;h1&gt;
  
  
  Socioeconomic aspects
&lt;/h1&gt;

&lt;p&gt;This product I'm making isn't entirely a technological endeavor because it's a game with the requirement to satisfy a certain type of market's demand. Nonetheless, I will ultimately succeed, before this decade is out, in making this product and establish revenue with the achievement of product-market fit.&lt;/p&gt;

&lt;p&gt;Furthermore, this development log isn't really a high utility factor as my likely and true target audience for this product doesn't even consume such content. It would be a negative utility factor to rely on this blog/codex for marketing this product. As such, I'm going to decrease the amount of these development updates so that I can devote more effort to the product's success.&lt;/p&gt;

&lt;p&gt;Now, I currently have two great problems to solve.&lt;/p&gt;

&lt;p&gt;As I am, first and foremost, an entrepreneur who treads an extraordinary path with a powerful mind and will, who (as in what market) should I serve? And what (as in what game product) should I make for them?&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>startup</category>
    </item>
    <item>
      <title>Q1 2019 Report</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Mon, 01 Apr 2019 19:37:30 +0000</pubDate>
      <link>https://forem.com/webdva/q1-2019-report-1e03</link>
      <guid>https://forem.com/webdva/q1-2019-report-1e03</guid>
      <description>&lt;p&gt;The report for the first quarter of the year 2019.&lt;/p&gt;

&lt;h1&gt;
  
  
  Game development effects and achievements
&lt;/h1&gt;

&lt;p&gt;I further improved my 3D modeling abilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5hfop2t668x0ibvzoe79.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5hfop2t668x0ibvzoe79.gif" title="A 3D model asset in my possession" alt="3D modeling"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I further improved my 3D animation abilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2For0fsfre1n0e4mc1xguf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2For0fsfre1n0e4mc1xguf.gif" title="Me gaining experience in 3D animation using weight painting" alt="Weight painting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I &lt;a href="https://webdva.github.io/how-i-implemented-client-side-linear-interpolation/" rel="noopener noreferrer"&gt;achieved&lt;/a&gt; an implementation of client-side linear interpolation combined with client-side prediction for a networked multiplayer game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7tsvk40w1ds238ikmcnu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F7tsvk40w1ds238ikmcnu.gif" title="Demonstration of the client-side linear interpolation system I made" alt="Client-side linear interpolation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I gained the capability to create and use shaders. I published a &lt;a href="https://webdva.github.io/a-very-brief-introduction-to-the-construction-of-shaders/" rel="noopener noreferrer"&gt;reference&lt;/a&gt; for constructing shaders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fupw5nz0d2jchtp0omssn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fupw5nz0d2jchtp0omssn.gif" title="Demonstration of the first shader I ever made" alt="Shader demonstration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I achieved collision detection for a networked multiplayer 3D game.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flu65u1hj3ialk3eyb8gb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flu65u1hj3ialk3eyb8gb.gif" title="Demonstration of my 3D collision detection achievement" alt="3D collision detection demonstration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Product development
&lt;/h1&gt;

&lt;p&gt;I began development of a 3D multiplayer browser game that went through many iterations.&lt;/p&gt;

&lt;p&gt;It first looked like this, a game with RPG combat:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fl47yep4z1fbmm5w8aj8t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fl47yep4z1fbmm5w8aj8t.gif" title="A proposed game concept I made and realized" alt="One of the initial iterations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And then it looked like this, an innovative pseudo-massive multiplayer flying shooter game idea:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg03sy53v017hacmj8rax.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg03sy53v017hacmj8rax.gif" title="The latest concept of the product" alt="One of the final iterations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Engineering and scientific capabilities gained
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I achieved the implementation for a conditional front-end browser source code minification system.&lt;/li&gt;
&lt;li&gt;I learned the concept of affine transformations for 3D game development, including movement along a forward facing vector and position translations in three dimensional space.&lt;/li&gt;
&lt;li&gt;I gained the capability to achieve rotations in three dimensional space for a 3D game, involving the knowledge of Euler angles and rotation matrices.&lt;/li&gt;
&lt;li&gt;I gained an understanding of quaternions.&lt;/li&gt;
&lt;li&gt;I learned new mathematical concepts such as the hyperplane separation theorem for implementing collision detection with oriented bounded boxes in three dimensions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Strategic commercial activities
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I planned to enter the modern browser game market space to obtain a portion of that market share in an effort to accomplish the Prosperity program's goal of establishing income as a technology entrepreneur before the year 2020.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I failed to achieve the Initial Product Release of a 3D multiplayer browser game before the end of the quarter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I considered a pivot from the business-to-consumer segment of game development due to a possible lack of founder-customer fit. Due to a set of cognitive biases and distortions, I actually may have been mistaken about the value of such consumer markets to me as an entrepreneur.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Personal aspects/Operating agent status
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I discovered and adopted the utility of eternal optimism. I now bear all the utilities needed to meet the requirements for having the right stuff.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Summary of the quarter
&lt;/h1&gt;

&lt;p&gt;I worked on the development of a 3D multiplayer browser game and obtained very useful capabilities. I am now in possession of more advanced technology, knowledge, and processes than what was had in the previous quarter (&lt;a href="https://webdva.github.io/2018-q4-report/" rel="noopener noreferrer"&gt;Q4 2018&lt;/a&gt;).&lt;/p&gt;

&lt;h1&gt;
  
  
  Predictions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Short term
&lt;/h2&gt;

&lt;p&gt;With a great commitment to the Prosperity program and to doing the right thing, the Prosperity program's success will be achieved, which is, ultimately, the convergence to a local optimum of prosperity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The far future
&lt;/h2&gt;

&lt;p&gt;Greater courage, integrity, commitment, and other treasures will be obtained. Greater nondominated solutions will be converged to and lesser dominated states diverged from.&lt;/p&gt;

&lt;p&gt;With the predicted post-Prosperity assets and capital that will be obtained, I will be able to eventually establish a far-reaching enterprise that engages in experimental physics and mend the world in innovative ways.&lt;/p&gt;

</description>
      <category>entrepreneurship</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>A Proposal for Achieving Oriented Collision Detection</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Fri, 15 Mar 2019 18:20:41 +0000</pubDate>
      <link>https://forem.com/webdva/a-proposal-for-achieving-oriented-collision-detection-5487</link>
      <guid>https://forem.com/webdva/a-proposal-for-achieving-oriented-collision-detection-5487</guid>
      <description>&lt;p&gt;I have an idea for a simple solution for accounting for orientations in collision detection that occurs in three dimensions.&lt;/p&gt;

&lt;p&gt;This is in consideration of an idea for a pseudo massive multiplayer online game with Dark Souls like combat.&lt;/p&gt;

&lt;p&gt;Due to the nature of Dark Souls's combat which involves the swinging of melee weapons, the orientation or rotation of the hypothetical weapons would need to be accounted for to provide accurate collision detection.&lt;/p&gt;

&lt;p&gt;An issue to consider is the art style which would affect many aspects of the game.&lt;/p&gt;

&lt;p&gt;Inspired by the very intelligent and impassioned game develeoper named Dek, his game &lt;a href="https://hordes.io"&gt;Hordes.io&lt;/a&gt; uses an innovative and simple art style for the characters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E4lIAqQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/05kc3utj5zbz65adcowq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E4lIAqQw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/05kc3utj5zbz65adcowq.gif" alt="Hordes.io art style" title="Hordes.io art style" width="880" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the proposed hypothetical game with Dark Souls like combat, each weapon would be entirely composed of a simple rectangular box. If the proposed simple art style is used, it would facilitate very accurate collision detection due to the collision boxes being the exact same shape and size as the hypothetical game characters and melee weapons.&lt;/p&gt;

&lt;h1&gt;
  
  
  Technical implementation proposal
&lt;/h1&gt;

&lt;p&gt;I propose a possible solution to achieving collision detection between two collision boxes in three dimensions with orientations accounted for: using affine transformations to transform the coordinate frame of one collision box's vertices to that of the coordinate frame of the other collision box.&lt;/p&gt;

&lt;p&gt;Using the transformation operators &lt;em&gt;T1&lt;/em&gt;, representing the original coordinate frame of the collision box to transform, and &lt;em&gt;T2&lt;/em&gt;, representing the coordinate frame of the second collision box that it will be transformed into, on the column vector &lt;em&gt;x1&lt;/em&gt; that is an untransformed vertex point of the first collision box will look like&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---2CP4Gbl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hydjz3gn6c7e0ijkxbu0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---2CP4Gbl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hydjz3gn6c7e0ijkxbu0.png" alt="equation" title="equation" width="200" height="32"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;with whatever the true four-by-four matrix multiplication order and direction is. The new vector point &lt;em&gt;x2&lt;/em&gt; would then be useful for determining if penetration between two oriented collision boxes has occurred.&lt;/p&gt;

&lt;p&gt;This should be a simple solution and it looks almost naive-like which is very desirable.&lt;/p&gt;

&lt;p&gt;I do not know if such a method or solution will achieve its intended effect and I would thus need to actually experiment and see if it would work and that the hypothesis of simply using affine transformations to achieve collision detection that accounts for orientations is true.&lt;/p&gt;

&lt;h1&gt;
  
  
  Practical considerations
&lt;/h1&gt;

&lt;p&gt;However, real world constraints currently prevent such an action of experimentation from being easily performed, such as not having the privilege of a testing space or environment, with using pen and paper being the best that I can do right now, and being limited by the Prosperity program's driving time constraint which must be considered in all decisions.&lt;/p&gt;

&lt;p&gt;Note, though, that the driving time constraint can allow the resulting flexible performance constraint to be exploited, such as by allowing the decision maker (me) to deem inaccurate collision detection to be acceptable which may result in orientations in the collision detection system not be accounted for at all, for example.&lt;/p&gt;

</description>
      <category>gamedev</category>
    </item>
    <item>
      <title>I achieved 3D collision detection</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Sat, 02 Mar 2019 17:15:24 +0000</pubDate>
      <link>https://forem.com/webdva/i-achieved-3d-collision-detection-2jel</link>
      <guid>https://forem.com/webdva/i-achieved-3d-collision-detection-2jel</guid>
      <description>&lt;p&gt;I was able to easily and quickly implement this functionality in part due to the experience and technology I acquired during this whole multiplayer game endeavor. I won't be detailing how I implemented collisions in three dimensions, so this won't be a very technically informative entry.&lt;/p&gt;

&lt;p&gt;The 3D collision detection subsystem uses axis aligned bounding boxes (AABB). Rotations are not accounted for.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d1E0ywj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bbezpk5a89jf4on5520f.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d1E0ywj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bbezpk5a89jf4on5520f.gif" alt="3D collision detection 1" title="The game server reports hits that occur."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's happening in the above screenshot is that, as a projectile sphere collides with the player avatar, the server reports that a hit has occurred.&lt;/p&gt;

&lt;p&gt;Here is another instance which somewhat demonstrates the accuracy of the hit detection:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vk3qkUsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/duj6l472h1fejmtsjsbe.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vk3qkUsR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/duj6l472h1fejmtsjsbe.gif" alt="3D collision detection 2" title="Another instance of the new 3D collision detection feature."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But there are some issues that must be considered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A hitbox shares the same position and movement translation as its assigned parent game object, but it does not rotate at all.&lt;/li&gt;
&lt;li&gt;A hitbox's size and dimensions are invariant. As such, as the hitbox does not rotate but its parent game object does, the invariant size and dimensions of the hitbox can cause an issue with the accuracy of collisions.&lt;/li&gt;
&lt;li&gt;A hitbox is a box whereas the projectiles are currently spheres, another accuracy issue.&lt;/li&gt;
&lt;li&gt;3D model creation and thus accurately determining the appropriate size for hitboxes on the game server is problematic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nonetheless, this new system element currently functions as an asset that will be used to achieve essential effects.&lt;/p&gt;

</description>
      <category>gamedev</category>
    </item>
    <item>
      <title>A Very Brief Introduction to the Construction of Shaders</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Mon, 04 Feb 2019 04:20:58 +0000</pubDate>
      <link>https://forem.com/webdva/a-very-brief-introduction-to-the-construction-of-shaders-3pal</link>
      <guid>https://forem.com/webdva/a-very-brief-introduction-to-the-construction-of-shaders-3pal</guid>
      <description>&lt;p&gt;This codex entry functions as documentation and as a reference manual for me when I create shaders. Note that there may be some discrepancies but it still suffices as a resource.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fundamentals
&lt;/h1&gt;

&lt;p&gt;The goal of the shader construct is to achieve graphical effects such as mesh deformation or recoloring. A shader performs operations first using the positions of all the vertices of a target such as a 3D model or 2D texture and then on the colors of the processed vertices. The portion of the shader that operates on the positions of the vertices is called a vertex shader and the portion of the shader that operates on the colors is called either a fragment shader or a pixel shader.&lt;/p&gt;

&lt;p&gt;Shown below is the source code for a vertex shader program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifdef GL_ES
&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="n"&gt;mediump&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Attributes&lt;/span&gt;
&lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="n"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Uniforms&lt;/span&gt;
&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="n"&gt;mat4&lt;/span&gt; &lt;span class="n"&gt;worldViewProjection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Varying&lt;/span&gt;
&lt;span class="n"&gt;varying&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;vUV&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;varying&lt;/span&gt; &lt;span class="n"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;vPosition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gl_Position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;worldViewProjection&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;vUV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;vPosition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  An initial segment that is C preprocessor-like
&lt;/h1&gt;

&lt;p&gt;As the programming language used to create a shader is a language that is like the C programming language, and like in C, a shader program can be configured with a segment of code located at the beginning of the program. The shader programmer can define constants here like the value of pi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile devices support
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifdef GL_ES
&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="n"&gt;mediump&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The preprocessor directive here instructs the shader program to use a lower precision for floating point values with the condition that the shader program is running on an OpenGL ES device which means OpenGL for mobile devices. This may cause a graphics quality difference between desktop and mobile versions, but this is to be expected as mobile devices often have greater performance constraints than desktop machines.&lt;/p&gt;

&lt;h1&gt;
  
  
  A paradigm for understanding attributes, uniforms, and varyings
&lt;/h1&gt;

&lt;p&gt;An attribute value can be thought of as literally an attribute of the current vertex, such as a position, namely &lt;code&gt;attribute vec3 position&lt;/code&gt;. Note that for the shader that we are using here, the CPU (or more pragmatically, the application that uses or calls the shader program) is supplying information from a 3D model and 2D texture to the shader program.&lt;/p&gt;

&lt;p&gt;A uniform value can be thought of as, with the meaning of the word &lt;em&gt;uniform&lt;/em&gt; being constant, a value that all the vertices or pixels will share as the value is the same for each vertex or pixel that the shader performs on, such as the current time elapsed since the shader program was started.&lt;/p&gt;

&lt;p&gt;And a varying can be thought of as a means to supply information from the vertex shader to the pixel shader, such as, literally, an attribute of the current vertex. The vertex shader will usually just calculate the position of the current vertex that it is performing on and then supply this information to the pixel shader as a &lt;code&gt;varying&lt;/code&gt;, which is what this particular vertex shader only does.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;attribute vec2 uv;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;I don't know all that is needed to be known about the word &lt;em&gt;UV&lt;/em&gt;, but from my Blender model texturing experience and the context, I infer that the &lt;code&gt;uv&lt;/code&gt; attribute is a mapping of texture and 3D mesh coordinates. So the vertex shader, especially as the &lt;code&gt;uv&lt;/code&gt; attribute value is assigned to the varying &lt;code&gt;vUV&lt;/code&gt; variable, passes each different texture-coordinate mapping to the fragment shader so that the fragment shader can operate using the mappings, particularly applying the 2D texture to the 3D mesh.&lt;/p&gt;

&lt;h1&gt;
  
  
  Calculating the position
&lt;/h1&gt;

&lt;p&gt;The &lt;code&gt;uniform mat4 worldViewProjection&lt;/code&gt; variable is a &lt;a href="https://gamedevelopment.tutsplus.com/tutorials/building-shaders-with-babylonjs-and-webgl-theory-and-examples--cms-24146" rel="noopener noreferrer"&gt;particular&lt;/a&gt; value that is the world matrix multiplied by the view matrix multiplied by the projection matrix which will not be discussed here in this documentation entry. The vertex shader calculates and determines the position of the current vertex with the line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;gl_Position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;worldViewProjection&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Accompanying pixel shader
&lt;/h1&gt;

&lt;p&gt;In conjunction with the use of the above vertex shader, here is the accompanying pixel shader.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#ifdef GL_ES
&lt;/span&gt;&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="n"&gt;mediump&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="n"&gt;precision&lt;/span&gt; &lt;span class="n"&gt;highp&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;varying&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt; &lt;span class="n"&gt;vUV&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;varying&lt;/span&gt; &lt;span class="n"&gt;vec3&lt;/span&gt; &lt;span class="n"&gt;vPosition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="n"&gt;sampler2D&lt;/span&gt; &lt;span class="n"&gt;textureSampler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;uniform&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texture2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textureSampler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vUV&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vPosition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xz&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Selection circle
&lt;/h1&gt;

&lt;p&gt;These two shaders are actually used to create a selection circle, a graphical effect where a circle appears around the bottom of a selected 3D model. As an example of what that looks like, my latest game shown below uses a selection circle effect (albeit a shader was not used to achieve it):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnskjirhrdcf7gh4tz5jz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnskjirhrdcf7gh4tz5jz.gif" title="An example of a selection circle" alt="Selection circle example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The theory for creating a target selection circle was obtained using this resource: &lt;a href="https://gamedev.stackexchange.com/a/141846" rel="noopener noreferrer"&gt;link&lt;/a&gt;. The goal is to obtain all the verices on a horizontal plane that are of a certain distance from the center of the target and then to color the collected vertices. As a selection ring, the width of the line of the ring must be greater than one pixel so that it may be noticed which was not specified in the resource.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;uniform float time;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;The &lt;code&gt;time&lt;/code&gt; variable is not used in this shader, but I'm letting it serve here as a reminder that it is provided by the CPU or caller of the shader to tell the shader how much time has elapsed since the shader has started running. It can be a different name like &lt;code&gt;u_time&lt;/code&gt;, for example, as shown in the &lt;a href="https://thebookofshaders.com/03/" rel="noopener noreferrer"&gt;Book of Shaders&lt;/a&gt; learning resource.&lt;/p&gt;

&lt;h1&gt;
  
  
  Applying the texture to the mesh
&lt;/h1&gt;

&lt;p&gt;The &lt;code&gt;vUV&lt;/code&gt; model-texture mapping variable that was passed by the vertex shader to the pixel shader for the current portion of the 3D mesh is used to apply the originally intended 2D texture color to the 3D mesh with the line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texture2D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textureSampler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vUV&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Creating the selection circle
&lt;/h1&gt;

&lt;p&gt;The &lt;code&gt;length&lt;/code&gt; function, as it returns the length of a vector, is used to obtain the distance between the center of the 3D mesh and the current fragment's position in the x-z plane.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vPosition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xz&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;vec2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a conditional, &lt;code&gt;if (distance &amp;gt;= 3.0 &amp;amp;&amp;amp; distance &amp;lt;= 3.5)&lt;/code&gt;, is used to determine if the current fragment's position is of the correct distance to be colored. The shader uses the color green.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;gl_FragColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vec4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  The result
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fyf1wdn7yid9ffyjuhd0v.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fyf1wdn7yid9ffyjuhd0v.gif" title="Selection circle shader" alt="Shader showcase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The shader works on terrains with varying heights and it overlays the color onto the terrain as shown with the hill portions being colored.&lt;/p&gt;

&lt;p&gt;One negative thing about the use of this shader is that it can show unintended artifacts of its process. For instance, if the model was a 3D cube then it would be clearly noticed. But a ground terrain often doesn't overlap with itself, so it's a non-issue.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>shaders</category>
    </item>
    <item>
      <title>How I Implemented Client-Side Linear Interpolation</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Sun, 20 Jan 2019 07:30:31 +0000</pubDate>
      <link>https://forem.com/webdva/how-i-implemented-client-side-linear-interpolation-4a4e</link>
      <guid>https://forem.com/webdva/how-i-implemented-client-side-linear-interpolation-4a4e</guid>
      <description>&lt;p&gt;As I'm committed to developing a great game for players, I made a simple client-side linear interpolation subsystem for the new 3D multiplayer browser game I'm making.&lt;/p&gt;

&lt;h1&gt;
  
  
  Background
&lt;/h1&gt;

&lt;p&gt;In the context of physical movement, the transition between an object's initial position &lt;em&gt;A&lt;/em&gt; and a target position &lt;em&gt;B&lt;/em&gt; can be interpolated causing a smooth-looking transition between the two positions. Linear interpolation is a means to achieve this smooth transition effect.&lt;/p&gt;

&lt;p&gt;The following equation shows how linear interpolation determines its effect, with &lt;em&gt;position&lt;/em&gt; being the resulting position, &lt;em&gt;start&lt;/em&gt; being the initial position, &lt;em&gt;end&lt;/em&gt; being the target position, and &lt;em&gt;time&lt;/em&gt; determining the length of time of the effect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg6ml2y1vms0iejojw4w7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fg6ml2y1vms0iejojw4w7.png" alt="math"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The linear interpolation implemented as a JavaScript function which the client-side linear interpolation subsystem uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;lerp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;end&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the word &lt;em&gt;lerp&lt;/em&gt; is short for linear interpolation and that the verb &lt;em&gt;to lerp&lt;/em&gt; means to do linear interpolation.&lt;/p&gt;

&lt;p&gt;The interpolation function can be modified to use more than a linear interpolation, but the simplicity of linear interpolation and its low cost of development has caused it to be the choice that best satisfies the program's constraints.&lt;/p&gt;

&lt;p&gt;Also, for documentation purposes and for creating predictive models that will be used in future game development endeavors, note that it took three hours (if I remember correctly) for me to implement this client-side linear interpolation subsystem.&lt;/p&gt;

&lt;h1&gt;
  
  
  Meeting system requirements
&lt;/h1&gt;

&lt;p&gt;I wanted a smooth transition between an object's current position and its new position as given by the game server on each server transmitted game state update.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;start&lt;/em&gt; value will be the object's current position value. The &lt;em&gt;end&lt;/em&gt; value will be the server's transmitted new position that it has determined for the game client.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;time&lt;/em&gt; value will be determined by the ratio between the time elapsed since the last frame and an arbitrary lerp time factor that will affect how long the movement interpolation will occur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fonqolfvbtbg22re8gsf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fonqolfvbtbg22re8gsf2.png" alt="math"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this proposed time ratio will achieve the desirable effect of having a smooth transition between object positions and thus meet system requirements.&lt;/p&gt;

&lt;p&gt;Using these proposed utilities, theoretically, if zero time elapsed since the last frame, then the object's position would remain the same, not changing, as evidenced by&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flnasi0ql4z5kzz4kthfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Flnasi0ql4z5kzz4kthfk.png" alt="math"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;which is desirable and meets the system requirements.&lt;/p&gt;

&lt;p&gt;Conversely, if the time elapsed between the last frame was equal to the lerp time factor, then the object's new position would be at the &lt;em&gt;end&lt;/em&gt; value, as evidenced by&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4s1k7ogk5vi2lejyuvt9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4s1k7ogk5vi2lejyuvt9.png" alt="math"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;which is also desirable and also meets the system requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  A contingency for late frames
&lt;/h2&gt;

&lt;p&gt;If the time since the last frame exceeds the lerp time factor, then the position is simply instantaneously changed instead of being linearly interpolated. A simple &lt;code&gt;if&lt;/code&gt; conditional is used to determine this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;time_since_last_frame&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;lerp_time_factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// do not use linear interpolation&lt;/span&gt;
    &lt;span class="nx"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;server_updated_position&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Implementation
&lt;/h1&gt;

&lt;p&gt;Below is a stylized implementation of what the simple client-side linear interpolation subsystem uses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;time_since_last_frame&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;lerp_time_factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// use linear interpolation&lt;/span&gt;
    &lt;span class="nx"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lerp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;server_updated_position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;time_since_last_frame&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;lerp_time_factor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// do not use linear interpolation&lt;/span&gt;
    &lt;span class="nx"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;server_updated_position&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that the physical movement in the actual game is actually frame rate independent and has been presented here as being dependent on the frame rate  for the reader's sake.&lt;/p&gt;

&lt;h1&gt;
  
  
  The results
&lt;/h1&gt;

&lt;p&gt;The picture shown below is a comparison between no linear interpolation being used and with linear interpolation being used. The left side shows jerky or disconnected movement as no linear interpolation is being used there while the right side shows a smooth transition between positions, per system requirements, with linear interpolation being used.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2hmddaxgdop97fmezaab.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2hmddaxgdop97fmezaab.gif" title="Comparison of no linear interpolation and with linear interpolation" alt="No lerp versus lerp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Client-side prediction and rubber banding
&lt;/h1&gt;

&lt;p&gt;So as to not wait on the game server for new coordinates to be transmitted as network latency can cause delays in client-server communication, as the player issues a movement command, the game client immediately changes the player's position before it receives the correct position from the game server, predicting what it will be for the player's benefit. The linear interpolation subsystem will then smoothly correct the player's position during the next frame when the client receives the actual position from the server.&lt;/p&gt;

&lt;p&gt;In conjunction with the use of this client-side prediction, when the game client loses its connection to the game server, a rubber banding effect occurs during player movement commands where the player's avatar behaves as if it was rubber banded to its position due to not receiving server position updates and thus always lerping between its current position and its predicted position until the connection to the server is reestablished.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fume8irqqh2qcaj82dor2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fume8irqqh2qcaj82dor2.gif" title="Rubber banding effect" alt="Rubber banding demonstration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that this rubber banding effect occurs and is less exaggerated during periods of network subsystem jitter. This is to be expected as it is common for networked multiplayer games that use linear interpolation.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>Final Gemini Project Report</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Sun, 13 Jan 2019 00:25:06 +0000</pubDate>
      <link>https://forem.com/webdva/final-gemini-project-report-298g</link>
      <guid>https://forem.com/webdva/final-gemini-project-report-298g</guid>
      <description>&lt;p&gt;The Gemini Project has served its purpose and is now completed. Due to the combination of the project's very generous and flexible performance constraint and its driving time constraint, I have determined that I have enough science, experience, and technology needed to develop a 3D multiplayer game.&lt;/p&gt;

&lt;p&gt;This final report will include a possible solution for dealing with the 3D level creation issue and a note on the relevance of 3D transformations.&lt;/p&gt;

&lt;h1&gt;
  
  
  Creating 3D levels with metadata using Blender
&lt;/h1&gt;

&lt;p&gt;3D levels or maps can be created in the Blender 3D modeling utility. Objects such as doors that can open and close would need to have properties associated with them so that this object-property mapping can be used by a game engine to facilitate intended game logic. Before the mappings can be used by a game engine, there must first be a way to extract the object properties from a Blender created 3D level. The following is a proposal for such a method of creating 3D levels with metadata using Blender.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating properties for the objects/entities in a 3D level
&lt;/h2&gt;

&lt;p&gt;I do not know, but I think that the properties for an entity in a 3D level can be created and handled using the Python-Blender programmable interface console, if I cannot do it using the default Blender user interface for each entity-property mapping that is to be created. This would be tedious and made doubly so because of Blender's apparent (not really what I think) cumbersome interface, but it would be viable and sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python utility for exporting entity-property mappings
&lt;/h2&gt;

&lt;p&gt;Since Blender allows 3D entities to have a programmable interface with the use of the Python programming language, a Python script can be created to obtain the metadata of a 3D level. In particular, we can create a Python script that exports the 3D level's metadata to a file with a format such as JSON.&lt;/p&gt;

&lt;p&gt;Here is Python source code technology that someone kindly &lt;a href="https://www.reddit.com/r/gamedev/comments/ac4uhe/whats_your_workflow_when_using_blender_as_a_level/ed5le0h/"&gt;shared freely&lt;/a&gt; that can help facilitate that utility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;bpy&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_json&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;json_dictionary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;json_dictionary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="c1"&gt;# obtain each 3D object in the level and retrieve its properties
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bpy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# essential object position, rotation, and scale properties
&lt;/span&gt;        &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"rotation"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotation_euler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotation_euler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotation_euler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"scale"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# metadata for custom aspects of the object
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s"&gt;"_RNA_UI"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;custom_property&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;custom_property&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;custom_property&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;custom_property&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                        &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# if the property is actually a valid property, then create a mapping
&lt;/span&gt;        &lt;span class="n"&gt;json_dictionary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_dictionary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sort_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blender allows its graphical user interface to be modified with its Python programmable interface thereby allowing the entity-property mappings to be extracted during editing. But I do not currently have the capability to implement such a Python-Blender graphical interface modification. So this proposed method will require the user to always first save the file to disk and then instruct the Python script to extract the level metadata from the Blender file on disk.&lt;/p&gt;

&lt;h1&gt;
  
  
  3D Transformations
&lt;/h1&gt;

&lt;p&gt;I've begun developing technology for a 3D multiplayer game. Committed to the Gemini Project's goal of making discoveries, I created subsystem prototypes to investigate and determine their feasibility in certain conditions and to create predictive (mental) models that can be used to achieve program and system success. One such subsystem involves the transmission of coordinates between a server and client in a 3D context.&lt;/p&gt;

&lt;p&gt;Behind the scenes of the .gif below, the subsystem consists of the player client sending to the server the map coordinates that the player 3D mesh intends to travel to which is determined by the location of the mouse cursor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bO0kPdaA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pymhhg7ovdr4efojqm6q.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bO0kPdaA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/pymhhg7ovdr4efojqm6q.gif" alt="Click-to-move subsystem demonstration" title="Incorrect direction of travel in the click-to-move subsystem prototype" width="648" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The .gif shows that the direction of travel of the 3D mesh as well as its final position after each movement is completed is not aligned with the mouse's location on the grid plane, thereby causing the 3D mesh to not move in the player's intended direction nor to the intended location. I believe that the cause of this may be that the client is sending to the server coordinates from a local space instead of the global space of the scene.&lt;/p&gt;

&lt;p&gt;From this, I infer that an understanding of transforming vectors from one vector space to another is essential for operating in a 3D environment. Also note that not much effort is needed (for me) to understand 3D transformations as I have discovered that a 3D transformation is only a process that consists of having four-by-four matrices being multiplied by appropriately sized matrix multiplicands.&lt;/p&gt;

&lt;h1&gt;
  
  
  The conclusion of &lt;em&gt;Project Gemini&lt;/em&gt;
&lt;/h1&gt;

&lt;p&gt;With this current data, technology, science, and experience that I now have pertaining to 3D game development thanks to the Gemini Project, I can begin to develop a 3D multiplayer game. Not only is this an engineering endeavor, but it is also a commercial one with the primary goal of establishing revenue and a means of income as a technology entrepreneur before this decade is out. Not only is this a long and daring journey with a high technical complexity, but it is also one with a complex market space that must be successfully operated and navigated in. This is not to mention the hyperparadigm that these two paradigms or systems are a part of, which calls for systems engineering and systems thinking skills that only champions possess.&lt;/p&gt;

&lt;p&gt;I have about one year of experience as a full-time indie maker, and the valuable lessons learned and startup experienced gained from that are being used as utility factors for achieving program success. But the core essential utility factors are courage, commitment, strength, and integrity.&lt;/p&gt;

&lt;p&gt;If I fail, it would be because I did not have what it takes to be an entrepreneur, that I did not have the right stuff.&lt;/p&gt;

&lt;p&gt;But I have said that I have what it takes. I have said that I have the right stuff. My word is my honor and I have the courage to uphold that honor, despite anything, as that is my integrity and constitution.&lt;/p&gt;

</description>
      <category>gamedev</category>
    </item>
    <item>
      <title>The Results of my Fourth Quarter of the Year 2018</title>
      <dc:creator>webdva</dc:creator>
      <pubDate>Tue, 01 Jan 2019 14:39:08 +0000</pubDate>
      <link>https://forem.com/webdva/the-results-of-my-forth-quarter-of-the-year-2018-p6c</link>
      <guid>https://forem.com/webdva/the-results-of-my-forth-quarter-of-the-year-2018-p6c</guid>
      <description>&lt;p&gt;A compilation of the activities that I engaged in during the fourth quarter of the year 2018.&lt;/p&gt;

&lt;h1&gt;
  
  
  Activities worthy of notice
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I discontinued the &lt;a href="https://webdva.itch.io/pantsu-versus-baka"&gt;&lt;em&gt;Pantsu versus Baka&lt;/em&gt;&lt;/a&gt; project. As a result of the &lt;em&gt;Pantsu versus Baka&lt;/em&gt; project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I further gained experience in marketing and media manipulation. I discovered the strategy of the combination of inbound and outbound marketing.&lt;/li&gt;
&lt;li&gt;I began to adopt the process of creating comprehensive documentation for systems and integrated this into my startup process.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My systems engineering and project management skills improved and entered a new phase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I made the &lt;a href="https://webdva.itch.io/spooky-thing"&gt;&lt;em&gt;Spooky Thing&lt;/em&gt;&lt;/a&gt; Halloween game being driven by market and consumer data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I promoted sanitized versions of my &lt;em&gt;How to draw a line in D3.js&lt;/em&gt; and &lt;em&gt;How to perform text classification using supervised learning&lt;/em&gt; tutorials on the &lt;em&gt;Dev.to&lt;/em&gt; online community platform and achieved excellent effects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leveraging the marketing knowledge and experience that I gained in the previous quarter (Q3 2018), I gained a foothold in the &lt;em&gt;Reddit&lt;/em&gt; social space and began a clandestine, slow, and delicate &lt;em&gt;Reddit&lt;/em&gt; influence and presence expansion campaign.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I discovered that I had a detrimental bias toward marketing due to a set of cognitive distortions and cognitive biases and then I began to modify my startup process to allocate more effort to the engineering of the product for this current phase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I achieved the &lt;a href="https://tibibi.herokuapp.com/"&gt;Initial Product Release&lt;/a&gt; of my first multiplayer game.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Networked multiplayer browser game development
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T-dfN2HC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/a8e9pksxpsvrmjqi9alp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T-dfN2HC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/a8e9pksxpsvrmjqi9alp.gif" alt="IPR demonstration" title="Initial Product Release of first multiplayer game" width="762" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I learned the socket.io framework for creating web applications that require real-time bidirectional event-based communication, namely for creating networked multiplayer browser games.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I discontinued the use of the socket.io framework and migrated to the ws Node.js WebSocket library and simultaneously learned the browser native WebSocket API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I learned about typed arrays in JavaScript for creating binary data protocols for multiplayer browser games.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I gained the capability to develop simple multiplayer browser game server technology and I am now in possession of newly created multiplayer browser game server technology.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leveraging my newly gained multiplayer browser game development skills and knowledge, I began conducting research for the sake of gaining the means to develop large scale persistent multiplayer games.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  3D game development
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---rE9hvkO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ta936eyvtye8iuva2d8r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---rE9hvkO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ta936eyvtye8iuva2d8r.gif" alt="Showing off new attack animation" title="First ever 3D attack animation demonstration" width="752" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I gained the capability to create basic and suitable 3D models and animations using the Blender 3D modeling and animation utility. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I began learning and operating the Babylon.js 3D game development framework utility and gained the capability to develop 3D browser games.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I started up the Gemini Project to provide the means and experience needed to develop a 3D multiplayer game. And as a result of the recent progress of the Gemini Project, I am currently in possession of newly created documentation and technology related to 3D game development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I created my first ever area of effect attack for a 3D game with new hit detection technology that will be used on the server side of the planned 3D multiplayer game. In the .gif below, when the player gets within range of the dummy target box and uses the attack, a hit is registered as indicated by the dummy target box changing color.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xkP6YLuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rm86u5hm72ud15mfqd5u.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xkP6YLuK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rm86u5hm72ud15mfqd5u.gif" alt="Area of effect display" title="Area of effect attack with hit detection" width="648" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  A look through the systems thinking paradigm
&lt;/h1&gt;

&lt;p&gt;The probability of my endeavor's success has increased from the previous quarter (Q3 2018) being governed by the nature of the mission success factor predictive mathematical model&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wctrv70g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/cia7e8tmk8oxzn5m3myy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wctrv70g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/cia7e8tmk8oxzn5m3myy.png" alt="Equation" title="Probability of success" width="211" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;with &lt;strong&gt;P(S)&lt;/strong&gt; being the probability of success for an endeavor where &lt;strong&gt;s&lt;/strong&gt; is the number of dimensions of complexity associated with the endeavor with &lt;em&gt;s&lt;/em&gt; &amp;gt; 1, &lt;strong&gt;t&lt;/strong&gt; is the time elapsed for a particular point in time of the endeavor, and &lt;strong&gt;c&lt;/strong&gt; is the combined value of complexity of all the complexities associated with the endeavor with &lt;em&gt;c&lt;/em&gt; &amp;gt; 0.&lt;/p&gt;

&lt;p&gt;In addition to the probability of my endeavor's success slowly but surely increasing as time progresses, my endeavor's probability of success is being further increased with the successful optimization of my utility factors. Utility factors which include integrity, strength, courage, and commitment.&lt;/p&gt;

&lt;h1&gt;
  
  
  Predictions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Short term
&lt;/h2&gt;

&lt;p&gt;With great struggle and endurance, I will achieve the Prosperity program's success with its goal being the establishment of a modest amount of revenue as an independent hacker before the year 2020.&lt;/p&gt;

&lt;h2&gt;
  
  
  Long term
&lt;/h2&gt;

&lt;p&gt;After I achieve the success of the Prosperity program, a decade long grind with the goal of obtaining even greater rewards as a technology entrepreneur will begin, as though I were grinding for a high score in a video game, especially as I play to win. The utilities gained during the Prosperity program will be used for the success of that post-Prosperity campaign.&lt;/p&gt;

</description>
      <category>entrepreneurship</category>
    </item>
  </channel>
</rss>
