How change Level of Detail Attribute of objects to boundingbox which are in frustum of moving camera?

116 Views Asked by At

I am trying implement frustum culling in maya , where I am turning Level of Detail to boundingbox [cmds.setAttr(object + '.overrideLevelOfDetail',0)] if they are not in the frustum of the selected camera : refer to the image for clear reference.

enter image description here

I have written this script till now, using this I can get the required result, but I want it to be dynamic, so if camera is moving it will set the display of objects depending upon their position as of now I need re run the script to be able to reflect the changes

Here is the code that I worked on till now : frustum culling maya

Any help would be appreciated

Thanks & Regards

EDIT :

change of camera location

still bbox after selecting objects

1

There are 1 best solutions below

3
Achayan On BEST ANSWER

You probably need to implement a event callback.. for example I changed your code a bit and added a timeChange callback. So when timeline moves it update proper.

def updateFrustum(arg):
    skip_meshes = ['camera1', 'front', 'persp', 'side', 'top']
    meshes = cmds.ls(type="transform")
    
    req_meshes = list(set(meshes) - set(skip_meshes))
    mesh_status = {}
    selected_cam = "camera1"
    for mesh in req_meshes:
        flag = in_frustum(selected_cam, mesh)
        if flag == 1:
            mesh_status[mesh] = True
        else:
            mesh_status[mesh] = False
    
    
    for key, value in mesh_status.items():
        if mesh_status[key] == True:
            cmds.setAttr(key + '.overrideEnabled', 1)
            cmds.setAttr(key + '.overrideLevelOfDetail',0)
        else:
            cmds.setAttr(key + '.overrideEnabled', 1)
            cmds.setAttr(key + '.overrideLevelOfDetail',1)
        cmds.select(key)        
    
    cmds.select(cl=True)

callback = OpenMaya.MEventMessage().addEventCallback( 'timeChanged', updateFrustum )