Тут просто обычная функция, или метод (если ты в классе реализуешь это), вот пример где всё хранится в массивах:
private int WorldToScreen()
{
screenCoords[0] = objCoord[0] * view_matrix[0] + objCoord[1] * view_matrix[1] + objCoord[2] * view_matrix[2] + view_matrix[3];
screenCoords[1] = objCoord[0] * view_matrix[4] + objCoord[1] * view_matrix[5] + objCoord[2] * view_matrix[6] + view_matrix[7];
screenCoords[2] = objCoord[0] * view_matrix[8] + objCoord[1] * view_matrix[9] + objCoord[2] * view_matrix[10] + view_matrix[11];
screenCoords[3] = objCoord[0] * view_matrix[12] + objCoord[1] * view_matrix[13] + objCoord[2] * view_matrix[14] + view_matrix[15];
if (screenCoords[3] < 0.1f)
{
return 0;
}
ndc[0] = screenCoords[0] / screenCoords[3];
ndc[1] = screenCoords[1] / screenCoords[3];
ndc[2] = screenCoords[2] / screenCoords[3];
strucPoint.X = Convert.ToInt32((this.Width / 2 * ndc[0]) + (ndc[0] + this.Width / 2));
strucPoint.Y = Convert.ToInt32(-(this.Height / 2 * ndc[1]) + (ndc[1] + this.Height / 2));
return 1;
}
А вот источник где также описаны функции WorldToScreen, только для хранения они используют поля структур или классов: https://guidedhacking.com/threads/world2screen-direct3d-and-opengl-worldtoscreen-functions.8044/
Как найти видовую матрицу от туда же: https://guidedhacking.com/threads/how-to-get-started-with-learning-viewmatrix.13663/
Но я использовал метод поиска между -1.0 и 1.0