Я делаю игровой движок на основе холста, и мне интересно, есть ли у кого-нибудь хорошая информация о том, как добиться перспективы сверху. То, что я ищу, находится где-то посередине между традиционным видом с высоты птичьего полета и старым видом SNES mode7. Просто небольшой угол, чтобы создать иллюзию 3D.
Я пытаюсь выяснить, что будет лучшим способом справиться с искажением перспективы. Я не делаю повороты, так что 3D-матрица будет переборщить, но мне нужно иметь возможность иметь дело с рендерингом слоев карты под постоянным углом, и было бы неплохо, если бы угол можно было регулировать. Мне также нужно разобраться с искажением глубины. По сути, нижняя строка пикселей должна иметь ширину и высоту пикселя 1: 1, тогда для каждой строки она будет уменьшаться, например, на 5% или что-то в этом роде. Я хотел бы иметь возможность предоставить большой холст в качестве текстуры, а затем указать угол камеры от 0 до 90, где 0 - совершенно горизонтально, а 90 - вид с высоты птичьего полета.
У кого-нибудь есть соответствующие руководства или пример кода? Я немного поискал в Интернете, но все, что я нашел, кажется либо непригодным для использования в этом конкретном приложении, либо слишком сложным, выполняющим всевозможные сумасшедшие 3D-перекосы и повороты. Все, что я хочу, это взять обычную мозаичную сетку и немного откинуть ее назад, без поворотов или подобных сложных вещей.
Вот пример того, что я хочу; http://img801.imageshack.us/img801/2176/perspectivesample.jpg
Нижняя строка пикселей имеет соотношение пикселей 1: 1, а каждая строка над ней постепенно становится короче по горизонтали и вертикали. Исходная текстура верхней центральной области обычно составляет примерно половину высоты нижней центральной области, но она была сжата по вертикали и горизонтали, чтобы соответствовать перспективе.
Я думаю, что лучше всего будет отобразить текущее состояние окна просмотра на другом холсте в плоском виде с высоты птичьего полета, примерно с 50% дополнительным пространством сверху и по бокам, затем вырезать из него верхнюю треугольную область и нарисовать ее на фактическое видимое полотно.
Единственная проблема в том, что я плохо разбираюсь в математике, когда дело доходит до расчета углов и тому подобного.