pythonocc-core icon indicating copy to clipboard operation
pythonocc-core copied to clipboard

Setting

Open AlonSpinner opened this issue 4 years ago • 4 comments

Hi again,

I'm trying to calibrate the offline renderer's camera with my own intrinsic parameters (focal length and others) Noticing that the projection matrix is in OpenGL format, I found a way to do it with this: https://strawlab.org/2011/11/05/augmented-reality-with-OpenGL/

Unfortunately, I found no set method for the camera's projection matrix. Any idea how I can go about it?

Thanks, Alon

Code to extract projection matrix from a camera object:

from OCC.Display.OCCViewer import Viewer3d
from ctypes import c_double
import numpy as np
offscreen_renderer = Viewer3d()
offscreen_renderer.Create()
offscreen_renderer.SetModeShaded()

cam = offscreen_renderer.View.Camera()
data = cam.ProjectionMatrix().GetData()
v = list((c_double * 16).from_address(int(data)))
M = np.array(v).reshape((4,4)).T
print(M)

AlonSpinner avatar Nov 28 '21 14:11 AlonSpinner

According to the official documentation https://dev.opencascade.org/doc/refman/html/class_graphic3d___camera.html I can't see any method to directly set the projection matrix

tpaviot avatar Dec 01 '21 06:12 tpaviot

After a short review, I unfortunately did not find any solution

tpaviot avatar Dec 03 '21 05:12 tpaviot

I'll try to make a workaround function SetCameraIntrinsics(fx,fy,px,py) with these:

cam.SetDistance
cam.SetFOVy
cam.SetZFocus
cam.SetZRange
cam.SetIOD
cam.SetScale
cam.SetTile
cam.SetAspect

AlonSpinner avatar Dec 03 '21 07:12 AlonSpinner

Using : http://www.songho.ca/opengl/gl_projectionmatrix.html

def setOrthographicProjectionMatrix(cam,scale,aspect,n,f): # P1[0,0] = 2/scale # P1[1,1] = aspect*2/scale # P1[2,2] = -2/(f-n) # P1[2,3] = -(f+n)/(f-n) cam.SetProjectionType(cam.Projection_Orthographic) cam.SetZRange(n,f) #affects P1[2,2] P1[3,2] cam.SetScale(scale) #affects P1[1,1] P1[0,0] cam.SetAspect(aspect) #affects P1[1,1] P1[0,0]

AlonSpinner avatar Dec 03 '21 10:12 AlonSpinner