This does exactly what the title says. I worked on this for another thread, and thought I'd post it here. Could be very useful for a lot of things
Base code:
sx = sin(camAngleX) : cx = cos(camAngleX)
sy = sin(camAngleY) : cy = cos(camAngleY)
sz = sin(camAngleZ) : cz = cos(camAngleZ)
xPos = camPosX + xOffset*(cy*cz) + yOffset*(sx*sy*cz-cx*sz) + zOffset*(cx*sy*cz+sx*sz)
yPos = camPosY + xOffset*(cy*sz) + yOffset*(cx*cz+sx*sy*sz) + zOffset*(cx*sy*sz-sx*cz)
zPos = camPosZ + xOffset*(-sy) + yOffset*(sx*cy) + zOffset*(cx*cy)
An explaination of the variables:
All variables are floats. sx, sy, sz, cx, cy, cz just store the sine/cosine values of the camera angles. camAngleX, camAngleY, camAngleZ represent the camera's current angles of rotation. camPosX, camPosY, camPosZ represent the camera's current position. xOffset, yOffset, zOffset are the offset values relative to the camera. xPos, yPos, and zPos are the coordinates at which the object should be positioned.
EDIT:
Here are the three functions that were made from this code:
lockObjectToCamera(object, xOffset, yOffset, zOffset)
lockObjectToObject(object, baseObj, xOffset, yOffset, zOffset)
lockCameraToObject(camera, baseObj, xOffset, yOffset, zOffset)
`locks an object to the screen with offsets
function lockObjectToCamera(object as dword,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(camera angle x()) : cx = cos(camera angle x())
sy = sin(camera angle y()) : cy = cos(camera angle y())
sz = sin(camera angle z()) : cz = cos(camera angle z())
xPos = camera position x() + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = camera position y() + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = camera position z() + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position object object,xPos,yPos,zPos
set object to camera orientation object
endfunction
`locks an object to another object, with offsets
function lockObjectToObject(object as dword,lockTo as dword,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(object angle x(lockTo)) : cx = cos(object angle x(lockTo))
sy = sin(object angle y(lockTo)) : cy = cos(object angle y(lockTo))
sz = sin(object angle z(lockTo)) : cz = cos(object angle z(lockTo))
xPos = object position x(lockTo) + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = object position y(lockTo) + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = object position z(lockTo) + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position object object,xPos,yPos,zPos
set object to object orientation object,lockTo
endfunction
`locks a camera to object, with offsets
function lockCameraToObject(camera as dword,lockTo as dword,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(object angle x(lockTo)) : cx = cos(object angle x(lockTo))
sy = sin(object angle y(lockTo)) : cy = cos(object angle y(lockTo))
sz = sin(object angle z(lockTo)) : cz = cos(object angle z(lockTo))
xPos = object position x(lockTo) + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = object position y(lockTo) + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = object position z(lockTo) + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position camera camera,xPos,yPos,zPos
set camera to object orientation camera,lockTo
endfunction
Here's a no media example for dbp (just copy, paste, and run):
sync on : sync rate 0
autocam off
hide mouse
rate as float
`types
type vector
x as float = 0.0
y as float = 0.0
z as float = 0.0
endtype
type camera
pos as vector
rot as vector
endtype
`make camera
cam as camera
position camera 40.0,1.0,40.0
point camera 0,0,0
cam.pos.x=camera position x()
cam.pos.y=camera position y()
cam.pos.z=camera position z()
cam.rot.x=camera angle x()
cam.rot.y=camera angle y()
cam.rot.z=camera angle z()
`make level
level as dword = 1
make matrix level,100.0,100.0,20,20
set matrix level,1,0,1,1,1,1,1
position matrix level,-50.0,0,-50.0
`make gun
gun as dword = 2
make object box gun,0.2,0.2,0.5
`make spinning object
boxObj as dword = 3
make object box boxObj,1.0,1.5,2.5
position object boxObj,35.0,2.0,35.0
do
`rate scale value
rate=(10.0/screen fps())
`handle camera
cam.rot.x=cam.rot.x+mousemovey()*rate*2.0
cam.rot.y=cam.rot.y+mousemovex()*rate*2.0
cam.pos.x=cam.pos.x + cos(cam.rot.x)*sin(cam.rot.y)*rate*0.5*(keystate(17)-keystate(31)) + newxvalue(0.0,cam.rot.y-90,rate*0.5*(keystate(30)-keystate(32)))
cam.pos.y=cam.pos.y - sin(cam.rot.x)*rate*0.5*(keystate(17)-keystate(31))
cam.pos.z=cam.pos.z + cos(cam.rot.x)*cos(cam.rot.y)*rate*0.5*(keystate(17)-keystate(31)) + newzvalue(0.0,cam.rot.y-90,rate*0.5*(keystate(30)-keystate(32)))
rotate camera cam.rot.x,cam.rot.y,cam.rot.z
position camera cam.pos.x,cam.pos.y,cam.pos.z
`rotate box
rotate object boxObj,object angle x(boxObj)+2.5*rate,object angle y(boxObj)+2.5*rate,object angle z(boxObj)+2.5*rate
`use of locking functions
lockObjectToCamera(gun,0.3,-0.3,1.4)
`lockObjectToObject(gun,boxObj,0.5,1.0,1.5)
`lockCameraToObject(0,boxObj,0.5,1.0,-2.5)
sync
loop
`locks an object to the screen with offsets
function lockObjectToCamera(object as dword,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(camera angle x()) : cx = cos(camera angle x())
sy = sin(camera angle y()) : cy = cos(camera angle y())
sz = sin(camera angle z()) : cz = cos(camera angle z())
xPos = camera position x() + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = camera position y() + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = camera position z() + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position object object,xPos,yPos,zPos
set object to camera orientation object
endfunction
`locks an object to another object, with offsets
function lockObjectToObject(object as dword,lockTo as dword,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(object angle x(lockTo)) : cx = cos(object angle x(lockTo))
sy = sin(object angle y(lockTo)) : cy = cos(object angle y(lockTo))
sz = sin(object angle z(lockTo)) : cz = cos(object angle z(lockTo))
xPos = object position x(lockTo) + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = object position y(lockTo) + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = object position z(lockTo) + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position object object,xPos,yPos,zPos
set object to object orientation object,lockTo
endfunction
`locks a camera to object, with offsets
function lockCameraToObject(camera as dword,lockTo as dword,xOff as float,yOff as float,zOff as float)
sx as float : sy as float : sz as float
cx as float : cy as float : cz as float
xPos as float : yPos as float : zPos as float
sx = sin(object angle x(lockTo)) : cx = cos(object angle x(lockTo))
sy = sin(object angle y(lockTo)) : cy = cos(object angle y(lockTo))
sz = sin(object angle z(lockTo)) : cz = cos(object angle z(lockTo))
xPos = object position x(lockTo) + xOff*(cy*cz) + yOff*(sx*sy*cz-cx*sz) + zOff*(cx*sy*cz+sx*sz)
yPos = object position y(lockTo) + xOff*(cy*sz) + yOff*(cx*cz+sx*sy*sz) + zOff*(cx*sy*sz-sx*cz)
zPos = object position z(lockTo) + xOff*(-1*sy) + yOff*(sx*cy) + zOff*(cx*cy)
position camera camera,xPos,yPos,zPos
set camera to object orientation camera,lockTo
endfunction
And here's a function that works with dbc (thanks Duke Blue Devils/Latch):
FUNCTION weapon_control(object_num,xOffset,yOffset,zOffset)
set object rotation zyx object_num
camAngleX#=camera angle x()
camAngleY#=camera angle y()
camAngleZ#=camera angle z()
camPosX#=camera position x()
camPosY#=camera position y()
camPosZ#=camera position z()
sx# = sin(camAngleX#) : cx# = cos(camAngleX#)
sy# = sin(camAngleY#) : cy# = cos(camAngleY#)
sz# = sin(camAngleZ#) : cz# = cos(camAngleZ#)
xPos# = camPosX# + xOffset*(cy#*cz#) + yOffset*(sx#*sy#*cz#-cx#*sz#) + zOffset*(cx#*sy#*cz#+sx#*sz#)
yPos# = camPosY# + xOffset*(cy#*sz#) + yOffset*(cx#*cz#+sx#*sy#*sz#) + zOffset*(cx#*sy#*sz#-sx#*cz#)
zPos# = camPosZ# + xOffset*(-1*sy#) + yOffset*(sx#*cy#) + zOffset*(cx#*cy#)
position object object_num,xPos#,yPos#,zPos#
set object to camera orientation object_num
set object rotation xyz object_num
ENDFUNCTION
Who needs a signature?