Blog

3D Retro gaming in the Sony Ericsson W550 – Blender I/O

retrogaming

The Sony Ericsson W550 was released in 2005, and the 3D video games that came with it impacted the mobile world. Fast forward to 2024, and the question is: With the current AI state and Blender, could it be possible to (at least) load a 3D model in this retro phone? To answer that, we need to unveil some of the resources available at the time for game developers.

The 3D game environment landscape in 2005

Nokia was a strong contender for Sony Ericsson in the mobile arena; however, the different SDK libraries for both of these companies’ software and hardware used a common denominator: The JSR 184 standard for Mobile 3D Graphics. With the JSR 184 functions and classes, any Java-based mobile game could process 3d graphics, cameras, lights, and textures in low-end graphic processors. In the case of the Sony Ericsson W550’s whooping 220×176 pixel screen, displaying a 3d environment, a 3d character, a culling camera, and running smooth graphics was truly an achievement for the era.

Partners who launched Mascot Capsule v3 or JSR-184 game titles for Sony Ericsson phones include: Bandai Networks, Com2uS, Digital Chocolate, Exit Games / Fishlabs, Gameloft, Infospace, I-play, Microforum, Mitsui / Zapptrio, NotTheFly, and Superscape.

You can research more about how 3d Java games are coded in this forum>>
A quick guide on the m3g classes>>
PDF lecture presentation by Eurographics 2008 summit (MIT) /page300>>
How the classes and calls to the library are done in this link>>
This post claims you can invoke a 3D object in 10 lines of code for the Sony Ericsson phones>>
How to assign a texture to your 3D Java model>>
Animation method calls in Java 3D >>
Mascot Capsule 3D file preservation demos>>

The technical specifications in this link describe how you can import 3D models into the Java environment. It is the authoring tool (via code) that can import or export .m3g files to deploy to full games via proprietary game development environments’ SDKs.

However, if you’re more of the GUI type of game developer, there’s a “Mobile 3D Graphics” or “.m3g” viewer/importer/exporter modified in the internet archive, the M3G Toolkit>> It’s worth mentioning that .m3g files cannot be converted to obj. But! There were also versions of games with models in mbac format (on Sony Ericsson). They can be converted to obj!

The M3GViewer lists all the classes necessary for the Java visualization including triangulation strip array (triage coordinates), lights, textures, world, and camera.

Java Mobile 3D is NOT “Java 3D”

Before we delve into what Java Mobile 3D is, it is equally important that we understand what Java Mobile 3D is not.
In particular, Java Mobile 3D should not be mistaken for Java 3D.
Java 3D is a Java extension API under development by Sun Microsystems to implement 3D graphics rendering for the Java run-time environment on desktops and workstations. To be explicit, these are the APIs and classes that belong to the package com.sun.j3d.

On the other hand, Java Mobile 3D was developed under the guidance of the Java Community Process (JCP), a consortium of companies whose purpose is to develop extensions for the Java platform. Members of the JCP (of which Sony Ericsson is one member) had devised a Java extension API that supports 3D graphics rendering on mobile devices. The JCP has documented this API in the Java Specification Request (JSR) 184, which is often termed “JSR 184”. The classes that implement the JSR 184 specification belong to the package javax.microedition.m3g

Using the wayback machine, we can see how the Sony Ericsson SDK for Java ME Platform could instantly edit and help you design Midlets (java 3d applications) for the W550 phone:

The Sony Ericsson SDK 2.2.3 included additional development tools for the Java ME platform such as an emulator of different Sony Ericsson’s physical devices, and their API profiles.

In 2005, the Java ME platform download available from Sun Microsystems (later acquired by Oracle in 2010) was known as the Java 2 Platform, Micro Edition (J2ME). Developers would typically download the Wireless Toolkit (also known as the Sun Java Wireless Toolkit) for developing mobile applications. The toolkit included tools and emulators for creating and testing applications on mobile devices.

Key components available at that time were:

  1. J2ME Wireless Toolkit – Provided the development environment for creating Java ME applications.
  2. CLDC (Connected Limited Device Configuration) – Defined the basic framework for a Java ME runtime environment on small devices.
  3. MIDP (Mobile Information Device Profile) – Provided the APIs needed for developing mobile applications.

These tools were essential for developing applications for mobile devices using the Java ME platform.

Back in 2005, the new 3d games developed for the Sonny Ericsson W550 were mostly created by Sony developers in Japan. They used the game engine “Mascot Capsule 3D“. How these and other 3d games around the world came to be in the gaming market is a topic for another post, although it’s worth mentioning another dedicated proprietary mobile game software like Fishlab’s Abyss Engine was also pumping cool 3d games to the market at the time.

Despite the existence of both Linux and Windows XP PCs, the latter is more popular worldwide. Most development was done on Windows XP x32 operating systems. Therefore, if you want to develop Java Mobile 3D games, it is recommended to use the same environment. Additionally, games with Java 3D were often created in Eclipse using the J2ME Wireless Toolkit as an emulator.

These are other interesting tutorials by Mobile Fish *MUST READ*>> including how to export from 3DsMax>>

How to install J2ME Wireless Toolkit>> and setup a teapot project>>

This thread clarifies the need to install the Java environment and also the Sony Ericsson SDK(log update details)>>
On Windows, Java ME SDK is the successor to the popular Java Wireless Toolkit 2.5.2 and Java Toolkit for CDC. It integrates CLDC, CDC and Blu-ray Disc Java (BD-J) technology into one SDK

Also, here’s a link to a very detailed NOKIA Forum on the JSR.184 3D Guidelines for development>>

I just want to play 3D Java games on my PC

In 2025, the Mascot Capsule 3D Java wrapper is used in the J2LME emulator, which you can install on Android/iOS, target a directory in your phone with already downloaded Java games, and play them on your phone. Incidentally, if you’re developing in an Android environment, Google has kindly preserved the required libraries for the 3d Java .m3g format for Android>>

You can also play on your PC (Windows x32) using this emulator>> , video>> The emulators for Java games work well considering it’s a true emulation of the original 3D libraries and other Java dependencies required to recreate the sounds and graphics. You’ll need to configure your PC keyboard to emulate the arrow (joystick pad button in some phones) and the numeric keyboard as if it were a phone.

But let’s stay on track: How were these games created?

Generating the 3D .JAR/.JAD Worfklow

Follow the link in the citation below, there’s an official example of how to load a teapot using the J2ME Wireless toolkit and 3DsMax 7, but these principles can be applied to Blender 2.49a as well. It’s important to note that all 3d elements are assigned to 3d coordinates, properties, and an array order in the “world” for the MIDLet to work. Once you’ve described these properties, the library can even work with: animations, particles, blend shapes, different types of lights, etc… it’s almost like the 2025 USD format of our era to describe and create 3D scenes.

⭐In this linked example code page>>, ⭐ you can see that when you use the J2ME Wireless Toolkit GUI it is much easier to understand how the vertex coordinates and all other properties are generated on the fly. This generates a JavaMidlet for your phone.

In the end, you only need to place the object’s texture (always .png), the .m3g file, and the midlet.java inside the Java environment’s specific project folders (m3g / res / icon). The example code page also shows how to use the “proguard.jar 3.4” to compress your Java code, so you can finally create the deploy (obfuscated) package (final .jar application) to use inside the virtual/real mobile phone.

In 2024, if you use proguard, you can find the github link here>>

For the phone to read the file, you can use a Bluetooth dongle from the PC to send the .jar to your phone’s internal storage (set your phone to connect to the PC dongle’s Bluetooth signal), or use the DCU60 USB data cable to push the file to the phone’s internal storage Explorer, using the Sony PC suite install CD that came with the phone (similar to this disk>> or this 2006 install disk>>) . Alternatively, you can use an emulator (included in the J2ME Wireless toolkit) to view the 3d model you created.

This is a link from the Sun Developer Network about Getting Started With the Mobile 3D Graphics API for J2ME>>

You can also check out this forum for help and tutorials about coding for J2ME. Mind these pages are invoked with the internet archive, but still very useful to clear out doubts about MIDlets for 3d games.

If you’d like to code objects and the world, have a look at how the classes are used for beginner setup, advanced classes, and even particle effects by legend programmer REDIKOD! PART1 | PART 2 | PART 3 | PART 4 | PART 5

Here’s a summary of what we have so far for the mobile game development environment for the Sony Ericcson W550 in the year 2005:

Note: Oracle has EOL (discontinued) the Java SE Development Kit 1.4.2. In the previous link, you’ll find Java SE Development Kit 1.4.2_18 and 19th versions were available for Windows, after that, versions 20+ are solely developed for Linux.

This is the Blender version compatible to export to .m3g format (Video by Perfe Lang)

“Monster Capsule 3D” evolved in time, until the Iphone launched, when it became “Mascot Capsule Eruption ST” with even more powerful 3d libraries for the new touch screens. Square Enix announced some of their games were also being ported to mobile phones using “Eruption ST”

Converting 3d objects to .m3g using BLENDER

Blender version 2.49a can export .m3g format natively WITH THIS ADDON.
Some (specialized) add-ons target specific games to extract or export to .m3g files; you can research GitHub or Reddit. However, the vast majority of those resources are in Russian or Indonesian languages.

In 2005, there was a Blender conference talking about the advantages of the .M3G format, and how Blender could generate the necessary assets for the different game engines that required that format:

Hands-on development in Blender (2005) for 3d Mobile games and the JSR 184 format

Back in 2007, there was an amazing guide on how to import and code a 3D object using Blender 2.49a. The code presented on this page (*MUST READ*) was the startup point to create a custom 3d viewer using AI with ChatGPT.

ChatGPT 4.0 – Creating a simple 3D viewer for the Sony Ericsson W550

Now that we understand the entire context to bring our m3g model inside a Java environment, it’s time to test ChatGPT4; feed it the same context, and see if it truly understands what is required to generate the .jar/.jad application. We want to create a simple viewer controlled with a slider to turn around the 3D model in the Y axis of the phone’s world.

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.m3g.*;

public class ModelViewer extends GameCanvas implements Runnable {
    private Graphics g;
    private World world;
    private Camera camera;
    private Transform transform;
    private Loader loader;
    private Object3D[] objects;
    private float angle = 0;
    private float rotationSpeed = 0.1f; // default rotation speed

    private Slider speedSlider;

    public ModelViewer() {
        super(true);
        g = getGraphics();
        initializeWorld();
        speedSlider = new Slider(0, 100, 50); // Min, Max, Initial value
        new Thread(this).start();
    }

    private void initializeWorld() {
        try {
            loader = new Loader();
            objects = loader.load("/path/to/model.m3g");
            world = new World();
            for (int i = 0; i < objects.length; i++) {
                world.addChild(objects[i]);
            }

            camera = new Camera();
            world.addChild(camera);
            world.setActiveCamera(camera);

            transform = new Transform();
            camera.setPerspective(45.0f, (float) getWidth() / (float) getHeight(), 1.0f, 1000.0f);
            camera.translate(0, 0, 10);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run() {
        while (true) {
            update();
            render();
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void update() {
        angle += rotationSpeed;
        transform.setIdentity();
        transform.postRotate(angle, 0, 1, 0);
        objects[0].setTransform(transform);
    }

    private void render() {
        g.setColor(0xFFFFFF);
        g.fillRect(0, 0, getWidth(), getHeight());
        world.render(g);
        flushGraphics();
    }

    protected void keyPressed(int keyCode) {
        if (keyCode == KEY_NUM2) { // Increase speed
            rotationSpeed += 0.1f;
        } else if (keyCode == KEY_NUM8) { // Decrease speed
            rotationSpeed -= 0.1f;
        }
    }
}

class Slider {
    private int min;
    private int max;
    private int value;

    public Slider(int min, int max, int value) {
        this.min = min;
        this.max = max;
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        if (value >= min && value <= max) {
            this.value = value;
        }
    }
}

The above code pretends to import the required libraries to invoke the 3d object, place it in the world, and create a slider for the user that can rotate the model left or right using the 2 and the 8 number keys.
You can read the entire conversation for this code here>>

If you want to access the Sony Ericsson’s W550 top screen keys (they are called “soft keys”), you can see an example here>>

With this in mind, what other 3D features would you like to create to interact with the 3D model?

Taking a walk down memory lane to admire the evolution of 3D graphics in the early days of mobile gaming is truly remarkable. Consider the racing car games, multiplayer experiences with 3 to 4 characters on a single screen, shoot-’em-up games, and expansive RPGs with sea and mountain worlds that entertained us for hours without slowing down our phones. And there’s a lot to say about sound compositing! But for now, let’s move on to the next peak of the mobile era…

Beyond flat graphics in the mobile gaming industry: The 3D revolution

Gameloft is a highly-known game company for creating iconic titles during the 2000s’ second wave of the mobile gaming era. They dominated the market for several years with excellent adaptations of existing video games on the Sony Playstore. However, they eventually fell behind due to missed opportunities in the rapidly evolving economic landscape of the mobile gaming industry and other competitors. For further cultural and economic context, I recommend watching this 8-minute video>>. Most of their games improved significantly with advanced graphic capabilities, and it is well known that they developed games for both Nokia and Sony Ericsson before the advent of the Android OS.

In the year 2011, a new phone with a 3D screen came to the scene: the LG Optimus 3D. Although our current article is not a full recount of the Android OS libraries and hardware that greatly improved the quality of gaming, Gameloft was certainly ahead of the curve by developing great titles for this 3D phone with true 3D depth such as Assasin’s Creed (Altair Chronicles), Nova 2, Spiderman among others, opening huge opportunities for dedicated GPU specialized phones even to this day.

Maybe, I should cover how a 3D screen in a 3D phone works with 3D games… What do you think? Let me know if this is something you’ll be interested in reading. Also, if you liked this topic, don’t forget to subscribe to my website for more CGI 3D news.

Share your thoughts here.

This site uses Akismet to reduce spam. Learn how your comment data is processed.