Simulation Industry

Virtual Reality

IKEA is evaluating bringing more realism in the interior design with the help virtual reality that will allow people to not only experience a full 360° view, but to also experience walking around the virtual models and feel measurement.See video on ’YouTube’.

Project

IKEA 3D Virtual Kitchen Planner platform is the current application to design kitchen, it’s a web desktop application with 3D rendering tool. 

IKEA was exploring to evaluate the feasibility of using virtual reality to achieve a higher truly three-dimensional (3D) interior design of a kitchen. Decided to build a prototype that can be tested in some retail stores around the world. 

Problem in-house format (3D model) not supported by Virtual Reality Engine such as UNREAL (not able to read the information for rendering). 

 My mandate was to develop an application that takes a 3D model in the proprietary format and convert it to Autodesk FBX format (supported by Virtual Reality engine such as UNREAL). 

Generating a 3D Scene Graph (Technology)

The room is composed of a cabinet, floor, wall, and roof represented by what is called a scene graph. That is the way the room is organized, and the rendering engine needs to traverse this scene graph to be able to display on the computer screen.

Simply put, scene graph is a representation of the world by a set of nodes connected by a child or sibling relationship. A node can represent an entity in the world such a car. The top node of the scene is calling the root node, has a list of children as well as a transformation in the 3D space. Transform associated to the node is composed of three aspects, namely, the position, the rotation, and the scale. 

To reproduce the scene graph in Autodesk FBX format, re-use and adapt some in-house algorithms to our need. Used some of their libraries functions for reading 3D model original format and extract scene graph node information.

  • Library already developed for the current format (company software) 
  • Re-use part of this library (read proprietary format) and adapt it to our needs 
  • Developed new algorithms to support creation of the new scene graph in FBX format
  • Fix bugs (modify/adapt part of their code library was not designed to do such thing)
  • Prototyping and fine-tuning our algorithm on simple model

Below meshing of the complete room (floor, cabinet, …)

FBX autodesk scene graph main algorithm

// main algorithm 
	bool SimpleApplication::createCompleteRoom(FbxManager* g_SdkManager, FbxScene* pScene)
	{
		bool w_ret = false;

		std::cout << "Starting the extract procedure of the complete room\n";

		// sanity check, make sure scene exist
		assert(nullptr != pScene->GetRootNode());
		size_t w_sceneChildCount = pScene->GetRootNode()->GetChildCount();

		// --- create Room with nothing in it (empty room)
		FbxNode* w_roomStuffNode = createRoomStuff(g_SdkManager, pScene);
		assert( nullptr != w_roomStuffNode);
#if 1
		// --- createItemsFloor
		FbxNode* w_itemsFloorNode = createFloorItems(g_SdkManager, pScene);
		assert(nullptr != w_itemsFloorNode);
		std::cout << "Room extracted succesfully\n";

		// NOTE: Room is base node of the cabinet (parent node)
		// add Items_Floor (group node)
		w_roomStuffNode->AddChild(w_itemsFloorNode);
#endif // testing purpose

		// --- add nodes to scene
		pScene->GetRootNode()->AddChild(w_roomStuffNode);

		// clean model (removing BBox) not needed 
		if (FbxNode* w_foundIt = pScene->GetRootNode()->FindChild("Obstacles"))
		{
			std::cout << "Found a node which belongs to BBox";
			// returns child count
			size_t w_obsTclChild = w_foundIt->GetChildCount();
			do
			{
				FbxNode* w_child2rem = w_foundIt->FindChild("Mesh");
				FbxNode* w_remChild = w_foundIt->RemoveChild(w_child2rem);
			} while (--w_obsTclChild);
			assert(0 == w_foundIt->GetChildCount());

			std::cout << "Let's remove i for now\n";
			FbxNode* w_remNode = pScene->GetRootNode()->RemoveChild(w_foundIt);
			std::cout << "Node removed is: " << w_remNode->GetName() << "\n";
		}

		const char* w_EmptyRoom = "CompleteRoomDebug.fbx";
		if( Export(w_EmptyRoom, g_SdkManager, pScene, -1) == true)
		{
			// don't forget to delete the SdkManager 
			// and all objects created by the SDK manager
			DestroySdkObjects(g_SdkManager, true);
			w_ret = true;
		}
		else // could not create the scene
		{
			std::cerr << "Could not create scene to export\n";
			DestroySdkObjects(g_SdkManager, false);
			w_ret = false;
		}

		std::cout << "Finished exporting fbx scene to file\n";

		return w_ret;
	}

Below video showing the final product

Surgical Training Simulator

To be completed