Skip to content
Snippets Groups Projects
Select Git revision
  • 348561fedbb64909e94a9933f98ee391497c20c8
  • master default protected
  • cloud
  • gh-pages
  • v4.0
5 results

MexximpRemodellerMultipleObj.m

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    MexximpRemodellerMultipleObj.m 2.76 KiB
    function [ scene, mappings ] = MexximpRemodellerMultipleObj( scene, mappings, names, conditionValues, conditionNumber )
    % Remodeler used usually in remodelPerConditionAfterFunction
    %
    %
    % Typically pointed to by
    %    hints.batchRenderStrategy.remodelPerConditionAfterFunction
    %
    % At this point conditionNumber is not used but it might be used later for
    % information.
    %
    % HB, SCIEN STanford, 2017
    
    %% PROGRAMMING TODO
    %   The 1000 is just annoying and makes units better but we need a general fix.
    %   Maybe because we are using millimeters everywhere.
    
    % Where the light is coming from
    shadowDirection = rtbGetNamedNumericValue(names,conditionValues,'shadowDirection',[]);
    
    % 
    cameraPosition = rtbGetNamedNumericValue(names,conditionValues,'position',[]);
    
    %
    cameraLookAt = rtbGetNamedNumericValue(names,conditionValues,'lookAt',[]);
    
    cameraPTR = rtbGetNamedNumericValue(names,conditionValues,'PTR',[0 0 0]);
    
    objMovementFile = rtbGetNamedValue(names,conditionValues,'objPosFile','');
    
    
    %% Add a camera
    scene = mexximpCentralizeCamera(scene);
    lookUp = [0 0 -1];
    cameraLookDir = cameraLookAt - cameraPosition;
    cameraPTR = deg2rad(cameraPTR);
    
    transformation = mexximpLookAt(1000*cameraPosition,1000*cameraLookAt,lookUp);
    ptrTransform = mexximpPTR(cameraPTR(1), cameraPTR(2), cameraPTR(3), cameraLookDir, lookUp);
    
    cameraId = strcmp({scene.rootNode.children.name},'Camera');
    scene.rootNode.children(cameraId).transformation = ...
        transformation*mexximpTranslate(-1000*cameraPosition)*ptrTransform*mexximpTranslate(1000*cameraPosition);
    
    
    %% Translate the objects
    
    objects = loadjson(objMovementFile,'SimplifyCell',1);
    
    for i=1:length(scene.rootNode.children)
        for o=1:length(objects)
            if isempty(strfind(scene.rootNode.children(i).name,objects(o).prefix)) == false
        
                position = objects(o).position*1000;
                orientation = objects(o).orientation;
                
                scene.rootNode.children(i).transformation = scene.rootNode.children(i).transformation*...
               mexximpRotate([0 0 -1],deg2rad(orientation))*mexximpTranslate(position);
            end
           
       end
    end
    
    % Add directional light (named 'SunLight');
    ambient = mexximpConstants('light');
    ambient.position = [0 0 0]';
    ambient.type = 'directional';
    ambient.name = 'SunLight';
    ambient.lookAtDirection = shadowDirection(:);
    ambient.ambientColor = 10000*[1 1 1]';
    ambient.diffuseColor = 10000*[1 1 1]';
    ambient.specularColor = 10000*[1 1 1]';
    ambient.constantAttenuation = 1;
    ambient.linearAttenuation = 0;
    ambient.quadraticAttenuation = 1;
    ambient.innerConeAngle = 0;
    ambient.outerConeAngle = 0;
    
    scene.lights = [scene.lights, ambient];
    
    ambientNode = mexximpConstants('node');
    ambientNode.name = ambient.name;
    ambientNode.transformation = eye(4);
    
    scene.rootNode.children = [scene.rootNode.children, ambientNode];
    
    end