Code:
@name 3D Projection
@inputs CamPos:vector CamAng:angle WorldPos:vector
@outputs ScreenPos:vector2 ViewerPos:vector
@persist FoV
@persist [Screen]:vector2
@persist [ViewerPos ModPos]:vector
@persist [CPM CYM CRM]:matrix
@persist [FM]:matrix4 [PFV FV]:vector4
@trigger
runOnTick(1)
if(first())
{
FoV = 75 #Replace with your Field of View
Screen = vec2(1280,960) #Replace with your resolution
ViewerPos = vec(Screen/2,Screen:x()/(2*tan(FoV/2)))
}
CPM = matrix(
vec(1, 0 , 0 ),
vec(0,cos(CamAng:pitch()),-sin(CamAng:pitch())),
vec(0,sin(CamAng:pitch()),cos(CamAng:pitch()))
)
CYM = matrix(
vec(cos(CamAng:yaw()),0,sin(CamAng:yaw())),
vec(0,1,0),
vec(-sin(CamAng:yaw()),0,cos(CamAng:yaw()))
)
CRM = matrix(
vec(cos(CamAng:roll()),-sin(CamAng:roll()),0),
vec(sin(CamAng:roll()), cos(CamAng:roll()),0),
vec( 0 , 0 ,1)
)
ModPos = (CPM*CYM*CRM)*(WorldPos-CamPos)
PFV = vec4(ModPos,1)
FM = matrix4(
vec4(1,0,0,-ViewerPos:x()),
vec4(0,1,0,-ViewerPos:y()),
vec4(0,0,1,0),
vec4(0,0,1/ViewerPos:z(),0)
)
FV = FM*PFV
ScreenPos = vec2(FV:x()/FV:w(),FV:y()/FV:w())*Screen:x() using the math on wikipedia's page on 3D projection
Bookmarks