<?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>DEV Community: Thomas S</title>
    <description>The latest articles on DEV Community by Thomas S (@thomas_s_9e168f78d28ba60e).</description>
    <link>https://dev.to/thomas_s_9e168f78d28ba60e</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3987706%2Fe3532aa6-314c-4ddc-af84-8ad4ecf0050b.png</url>
      <title>DEV Community: Thomas S</title>
      <link>https://dev.to/thomas_s_9e168f78d28ba60e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thomas_s_9e168f78d28ba60e"/>
    <language>en</language>
    <item>
      <title>realvirtual WEB: an open-source 3D HMI for industrial digital twins, in the browser</title>
      <dc:creator>Thomas S</dc:creator>
      <pubDate>Tue, 16 Jun 2026 20:59:55 +0000</pubDate>
      <link>https://dev.to/thomas_s_9e168f78d28ba60e/realvirtual-web-an-open-source-3d-hmi-for-industrial-digital-twins-in-the-browser-4ifn</link>
      <guid>https://dev.to/thomas_s_9e168f78d28ba60e/realvirtual-web-an-open-source-3d-hmi-for-industrial-digital-twins-in-the-browser-4ifn</guid>
      <description>&lt;p&gt;Most "digital twin in the browser" demos are sealed viewers: a proprietary format, a hosted backend, and no way to connect your own controller. realvirtual WEB takes the opposite approach. It is open source (AGPL-3.0), it loads plain GLB files, and it talks to any PLC over a documented WebSocket protocol you can implement in about 30 lines of code.&lt;/p&gt;

&lt;p&gt;Here is what it is and why it is worth a look if you build for the web or work in automation.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/game4automation/realvirtual-WEB" rel="noopener noreferrer"&gt;https://github.com/game4automation/realvirtual-WEB&lt;/a&gt;&lt;br&gt;
Live demo: &lt;a href="https://web.realvirtual.io/demo" rel="noopener noreferrer"&gt;https://web.realvirtual.io/demo&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;realvirtual WEB is a browser-based 3D HMI and digital twin viewer for manufacturing. You give it a standard GLB/glTF file and it renders an interactive 3D model. Add &lt;code&gt;rv_extras&lt;/code&gt; metadata to that same GLB and the model becomes a working digital twin: drives move, sensors trigger, signals update, all from one self-describing file. There is no external scene database and no proprietary project format. The GLB is the single source of truth.&lt;/p&gt;
&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;It is a normal modern web app, not a plugin or a native runtime:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Three.js for rendering (WebGL, WebGPU in beta, WebXR)&lt;/li&gt;
&lt;li&gt;React 19 and Material UI 7 for the interface&lt;/li&gt;
&lt;li&gt;Rapier.js (WASM) for physics&lt;/li&gt;
&lt;li&gt;Apache ECharts for live and historical charts&lt;/li&gt;
&lt;li&gt;Vite 6, TypeScript 5.7 (strict)&lt;/li&gt;
&lt;li&gt;Vitest and Playwright, 1300+ tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Requirements: Node.js 20.19+ or 22.12+.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/game4automation/realvirtual-WEB.git
&lt;span class="nb"&gt;cd &lt;/span&gt;realvirtual-WEB
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop a &lt;code&gt;.glb&lt;/code&gt; into &lt;code&gt;public/models/&lt;/code&gt; and it appears in the model selector. That is the whole loop to see your own geometry in 3D.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting to a real controller
&lt;/h2&gt;

&lt;p&gt;The interesting part for automation people is the live link. realvirtual WEB visualizes PLC signals in real time over WebSocket or MQTT. The WebSocket side uses the rv WebSocket Realtime v2 protocol, and it is deliberately small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON over WebSocket, bidirectional&lt;/li&gt;
&lt;li&gt;signal-centric: the smallest unit is a named signal (Bool, Int, Float, Array). The protocol does not know about drives or sensors, only signals.&lt;/li&gt;
&lt;li&gt;delta-based: after the initial snapshot, only changed values are sent&lt;/li&gt;
&lt;li&gt;built for a 60 Hz update loop, matching the viewer's fixed-timestep engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the protocol is open and signal-only, a minimal bridge to your own system is about 25 to 30 lines of code in any language. You are not locked into a vendor SDK to feed the twin.&lt;/p&gt;

&lt;h2&gt;
  
  
  More than a viewer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transport simulation:&lt;/strong&gt; a 60 Hz fixed-timestep engine with conveyors, sensors, and collision detection. Kinematic by default, real physics via a Rapier plugin when you need stacking or friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Machine Information System:&lt;/strong&gt; attach PDFs and documentation directly to 3D components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebXR:&lt;/strong&gt; VR and AR on Meta Quest, Apple Vision Pro, and mobile, from the same build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout planning (beta):&lt;/strong&gt; drag-and-drop factory assembly in the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiuser (beta):&lt;/strong&gt; shared sessions with avatars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin architecture:&lt;/strong&gt; extend with custom HMI and behaviors via &lt;code&gt;viewer.use(new MyPlugin())&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-ready (MCP):&lt;/strong&gt; an MCP server lets AI assistants inspect, control, and debug the viewer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance, concretely
&lt;/h2&gt;

&lt;p&gt;CAD models are heavy, so the project ships with explicit budgets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;initial download (Three.js plus viewer) under 16 MB&lt;/li&gt;
&lt;li&gt;55+ FPS at 500K polygons&lt;/li&gt;
&lt;li&gt;under 500 draw calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The note that matters if you have fought WebGL performance before: the bottleneck for CAD is draw calls, not polygon count. Mesh merging and instancing usually beat polygon reduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;realvirtual WEB is AGPL-3.0-only. If you deploy it or build on it, including as a web service, you publish your project under the same license, and the watermark stays unless you hold a commercial license. Commercial licensing is available at &lt;a href="https://realvirtual.io/en/company/license" rel="noopener noreferrer"&gt;https://realvirtual.io/en/company/license&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this design
&lt;/h2&gt;

&lt;p&gt;A digital twin is only useful if it outlives the tools that made it. By using GLB as the data format and an open signal protocol as the wire format, realvirtual WEB keeps the twin portable and self-hostable. The geometry and the live data stay on your own infrastructure. You can read every line of the viewer, swap the controller, or write your own bridge. That is the part most twin platforms do not hand you.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/game4automation/realvirtual-WEB" rel="noopener noreferrer"&gt;https://github.com/game4automation/realvirtual-WEB&lt;/a&gt;&lt;br&gt;
Demo: &lt;a href="https://web.realvirtual.io/demo" rel="noopener noreferrer"&gt;https://web.realvirtual.io/demo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>threejs</category>
      <category>digitaltwin</category>
    </item>
    <item>
      <title>What Is a Digital Twin in Unity?</title>
      <dc:creator>Thomas S</dc:creator>
      <pubDate>Tue, 16 Jun 2026 20:51:29 +0000</pubDate>
      <link>https://dev.to/thomas_s_9e168f78d28ba60e/what-is-a-digital-twin-in-unity-584a</link>
      <guid>https://dev.to/thomas_s_9e168f78d28ba60e/what-is-a-digital-twin-in-unity-584a</guid>
      <description>&lt;p&gt;The word digital twin gets attached to almost anything that looks like a 3D model on a screen. In realvirtual.io it means something more specific. A digital twin is 3D geometry plus behavior. The geometry is what the machine looks like. The behavior is what it does. Without the behavior part you have a 3D viewer, not a twin.&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/CcLO-O2NyfY"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
The easiest way to see how the behavior is built is the Getting Started demo that ships with realvirtual.io. It is a small machine you can open, run, and take apart. Three building blocks make it work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drives make the geometry move
&lt;/h2&gt;

&lt;p&gt;A drive turns a static mesh into a moving machine axis. You attach a Drive component to a part, and that part can now translate or rotate with a real motion profile: acceleration, deceleration, speed, end positions. Machine axes are arranged as a kinematic hierarchy, so a part mounted on another part inherits its parent's motion. Move the base and everything on it follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behavior reacts and decides
&lt;/h2&gt;

&lt;p&gt;Drives move when something tells them to move. That something is a behavior model. Behavior models sit on top of drives and sensors and define the logic: when a sensor reports a part, close the gripper. When a cycle starts, run the axis to its end position. The behavior is driven by &lt;strong&gt;signals&lt;/strong&gt;. In the Getting Started demo you can force a signal by hand and watch the machine react: force the door signal and the machine door opens or closes. No code change, no recompile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signals and the interface to a real PLC
&lt;/h2&gt;

&lt;p&gt;Signals are not just an internal trick for testing. They are the same I/O a real controller exchanges with the machine. realvirtual.io models them as &lt;strong&gt;PLCInput&lt;/strong&gt; and &lt;strong&gt;PLCOutput&lt;/strong&gt; objects. The direction is defined from Unity's point of view as the simulated plant: a PLCInput is something Unity writes toward the controller, like a sensor reading, and a PLCOutput is something Unity reads from the controller, like an actuator command. While you build and test, you force those signals by hand. When you are ready for virtual commissioning, realvirtual.io Professional connects the same signals live to a real controller such as Siemens or Beckhoff, and the PLC program drives the twin instead of you. The behavior you built does not change. Only the source of the signals does.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The Getting Started demo is free. You get drives, behavior, sensors, and a PLC interface already wired up in the realvirtual.io &lt;strong&gt;Starter&lt;/strong&gt; from the Unity Asset Store. You need &lt;strong&gt;Unity 6.3 LTS&lt;/strong&gt; to open it. Install it, press play, and force a signal to feel how the three blocks fit together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free Starter: &lt;a href="https://assetstore.unity.com/packages/tools/integration/realvirtual-io-digital-twin-starter-6-303030" rel="noopener noreferrer"&gt;realvirtual.io Digital Twin Starter on the Unity Asset Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a href="https://doc.realvirtual.io/" rel="noopener noreferrer"&gt;doc.realvirtual.io&lt;/a&gt;
This article is part of the realvirtual Know-How series.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>unity3d</category>
      <category>digitaltwin</category>
      <category>simulation</category>
      <category>virtualcommissioning</category>
    </item>
  </channel>
</rss>
