Kitchen Planner
Virtual Reality Kitchen Planner
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 (www.ikea.com/ca/en/planners/kitchen-design-pub4bc87cb1).
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).
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). see Consultant
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