Обычно вы не преобразуете цилиндр в конус , используя матрицы. Это связано с тем, что оно включает масштабирование двух компонентов, когда коэффициент масштабирования зависит от третьего компонента.
Я думаю, что вы можете построить матрицу подобным образом, создав матрицу «взглянуть» (gluLookAt или D3DXMatrxiLookAtLH) и умножив ее на матрицу перспективы (gluPerspective или D3DXMatrixPerspectiveFovLH), но я серьезно сомневаюсь, что вы сможете визуализировать этот цилиндр с помощью OpenGL или D3D. Это связано с тем, что для работы проекции 3D-рендеринг использует 4-й векторный компонент - W, который рассчитывается умножением векторов на матрицу проекции. Компонент W обычно скрыт и доступен только через шейдеры. Перемешивание с этим компонентом обычно портит любую геометрию, и вы не можете превратить цилиндр в конус, не используя компонент w. То есть если вы преобразуете цилиндр в конус, вам придется использовать W, это приведет к нарушению проекции.
Предлагаю построить цилиндр нормально - из вершин. Это не сложно как в D3D, так и в OpenGL.
Если вы действительно хотите преобразовать цилиндр в конус, написание вершинного шейдера для преобразования цилиндра будет проще, хотя проверка правильности всех нормалей может быть проблемой.
Если вы хотите узнать, какие объекты попадают в световой конус, используйте математические вычисления и обнаружение столкновений. Это не сложно.
Если вы хотите визуализировать объекты, видимые в световом конусе, сделайте дополнительную цель рендеринга (или кадровый буфер), область просмотра или что-либо еще и визуализируйте объекты видимыми с точки зрения источника света.
О углу среза света.
Учитывая точку P, положение света L и направление света LDir, а также угол отсечки, вы можете легко проверить, находится ли P в пределах светового конуса. Для этого вам понадобится косинус либо полного, либо половины угла отсечки (зависит от того, рассчитывается ли угол отсечки относительно направления света или определяет ширину конуса). Сделайте вектор PDir = P - L, нормализуйте PDir и вычислите скалярное произведение между нормализованным PDir и нормализованным LDir, это даст косинус угла между направлением света в точке P. Если косинус (между PDir и Ldir) больше косинуса светового конуса, тогда точка находится внутри светового конуса.