ich habe vor einiger zeit eine kleine helper funktion dafür gemacht.
sie überprüft, ob ein punkt sich innerhalb einer pyramide befindet.
int point_check_pyramid(VECTOR *_point_pos, VECTOR *_pyramid_pos, VECTOR *_pyramid_ang, var _arcH, var _arcV)
{
// Automatically set arcV to the video aspect
if(!_arcV)
_arcV = _arcH * (screen_size.y / screen_size.x);
// Make Position and Orientation Local to the Pyramid
vec_sub(_point_pos, _pyramid_pos);
vec_rotate(_point_pos, vector(-_pyramid_ang.x, -_pyramid_ang.y, -_pyramid_ang.z));
//---
if( abs(_point_pos.y) < _point_pos.x * tan(_arcH / 2) && abs(_point_pos.z) < _point_pos.x * tan(_arcV / 2) && _point_pos.x > 0 )
return 1; // the given coordinate IS within the pyramid
else
return 0; // the given coordinate is NOT within the pyramid
}
das ganze funktioniert so:
1.Parameter: Koordinaten des Punktes, der überprüft werden soll
2.Parameter: Position der Pyramide, falls die Kamera gecheckt werden soll: camera.x
3.Parameter: Winkel der Pyramide, falls die Kamera gecheckt werden soll: camera.pan
4.Parameter: Horizontaler 'Field of View', falls die Kamera gecheckt werden soll: camera.arc
5.Parameter: Vertikaler 'Field of View' oder 0, wenn der Wert automatisch kalkuliert werden soll, abhänging vom Bildschirverhältnis
Wenn du also überprüfen willst, ob der Punkt (100, 200, 300) auf dem Bildschirm sichtbar ist benutze:
point_check_pyramid(vector(100, 200, 300), camera.x, camera.pan, camera.arc, 0)
...ich hoffe das ist nicht zu kompliziert
EDIT: was nicht geprüft wird, ist ob der punkt von anderen objekten verdeckt wird. Das muss mit einem weiteren c_trace überprüft werden.