Projection 3D

1 개요

3D 객체와 카메라의 정보가 주어졌을 때, 카메라에서 본 객체의 모양을 2D 이미지에 사영하는 알고리즘입니다.

2 알고리즘 상세 설명

3D Object Projected Image
Source Data Result Data

카메라는 삼차원 공간을 단번에 모두 볼 수 없으며, 동일한 각도에서 들어온 빛을 하나의 위치로 인식하게 됩니다. 시야각을 기준으로 생각할 때 실제 느껴지는 공간은 카메라를 중심으로 한 구면의 일부이며, 직사각형은 이에 대한 좋은 근사입니다.

Projection 3D 알고리즘은 카메라의 시야 방향과 시야각으로부터 결정한 직사각형으로 3D 객체를 사영한 결과를 표시합니다.

3 파라미터 설정 및 사용 방법

크게 세 가지 종류의 값, 즉 카메라의 상태, 결과 이미지의 정보, 투영할 객체를 설정해야 합니다.

카메라 상태 설정

결과 이미지 설정

객체 설정

4 예제 코드

CProjection3D projection3D;

int64_t i64Width = 562;
int64_t i64Height = 502;
float f32HorizontalAngleOfView = 50.378487f;
float f32VerticalAngleOfView = 45.000000f;
TPoint3<float> ptCameraPosition(-13.825953, -7.454907, 33.177425);
TPoint3<float> ptCameraDirection(0.420903, 0.229488, -0.877597);
TPoint3<float> ptDirectionUp(-0.099241, 0.973312, 0.206920);
TPoint3<uint8_t> ptBkgColor(51, 51, 51);
CFL3DObject floSrc;
floSrc.Load(LR"(C:\Users\Public\Documents\FLImaging\ExampleImages\Projection3D\icosahedron.ply)");
CFLImage fliDst;
projection3D.SetCameraPosition(ptCameraPosition);
projection3D.SetCameraDirection(ptCameraDirection);
projection3D.SetDirectionUp(ptDirectionUp);
projection3D.SetBackgroundColor(ptBkgColor);
projection3D.SetImageSize(i64Width, i64Height);
projection3D.SetAngleOfView(f32HorizontalAngleOfView, f32VerticalAngleOfView);
projection3D.SetSourceObject(floSrc);
projection3D.SetDestinationImage(fliDst);

projection3D.Execute();

	CProjection3D projection3D = new CProjection3D();

	long i64Width = 562;
	long i64Height = 502;
	float f32HorizontalAngleOfView = 50.378487f;
	float f32VerticalAngleOfView = 45.000000f;
	TPoint3<float> ptCameraPosition = new TPoint3<float>(-13.825953f, -7.454907f, 33.177425f);
	TPoint3<float> ptCameraDirection = new TPoint3<float>(0.569833f, 0.155816f, -0.806853f);
	TPoint3<float> ptDirectionUp = new TPoint3<float>(0.000000f, 1.000000f, 0.000000f);
	TPoint3<Byte> ptBkgColor = new TPoint3<Byte>(51, 51, 51);
	CFL3DObject floSrc = new CFL3DObject();
	floSrc.Load("C:\\Users\\Public\\Documents\\FLImaging\\ExampleImages\\Projection3D\\icosahedron.ply)");
	CFLImage fliDst = new CFLImage();
	projection3D.SetCameraPosition(ptCameraPosition);
	projection3D.SetCameraDirection(ptCameraDirection);
	projection3D.SetDirectionUp(ptDirectionUp);
	projection3D.SetBackgroundColor(ptBkgColor);
	projection3D.SetImageSize(i64Width, i64Height);
	projection3D.SetAngleOfView(f32HorizontalAngleOfView, f32VerticalAngleOfView);
	projection3D.SetSourceObject(ref floSrc);
	projection3D.SetDestinationImage(ref fliDst);

	projection3D.Execute();

	projection3D = CProjection3D()

	i64Width = 562
	i64Height = 502
	f32HorizontalAngleOfView = 50.378487
	f32VerticalAngleOfView = 45.000000
	ptCameraPosition = TPoint3[Single](-13.825953, -7.454907, 33.177425)
	ptCameraDirection = TPoint3[Single](0.569833, 0.155816, -0.806853)
	ptDirectionUp = TPoint3[Single](0.000000, 1.000000, 0.000000)
	ptBkgColor = TPoint3[Byte](51, 51, 51)
	floSrc = CFL3DObject()
	floSrc.Load("C:\\Users\\Public\\Documents\\FLImaging\\ExampleImages\\Projection3D\\icosahedron.ply)")
	fliDst = CFLImage()
	projection3D.SetCameraPosition(ptCameraPosition)
	projection3D.SetCameraDirection(ptCameraDirection)
	projection3D.SetDirectionUp(ptDirectionUp)
	projection3D.SetBackgroundColor(ptBkgColor)
	projection3D.SetImageSize(i64Width, i64Height)
	projection3D.SetAngleOfView(f32HorizontalAngleOfView, f32VerticalAngleOfView)
	projection3D.SetSourceObject(floSrc)
	projection3D.SetDestinationImage(fliDst)

	projection3D.Execute()