введення Правити
Frustum (піраміда видимості) являє собою усічену піраміду і умовно може бути представлена ось так:
Як і в реальному житті, ви не бачите те що не потрапляє в поле зору. Піраміда видимості виконує те ж саме - все що знаходиться всередині піраміди, буде відображено на екрані, а ось все що знаходиться за межами - ні, тому що це глядач не бачить.
Frustum Culling (Відсікання по піраміді видимості) - технологія дозволяє відсікти непотрібні об'єкти, котодие не перебувають в полі зору ігрової камери. Більш докладно можете прочитати frustum culling.
Також в даному уроці ми напишемо простий клас для роботи з камерою і нарешті на практиці випробуємо обробку введення, яка у нас є ще з першої версії фреймворка, але яку ми жодного разу не використали.
Пишемо код Правити
Створіть проект. Підключіть 5 фреймворк.
Timer Правити
Даний клас ми будемо використовувати для того щоб рух камери не залежить від FPS.
Camera Правити
Клас буде відповідати за роботу з камерою. Камера пов'язана з видовою матрицею. TurnLeft () і TurnRight () будуть повертати камеру вліво / вправо, якщо натиснута кнопка.
Методи TurnLeft () і TurnRight () отримують логічне значення. Якщо це значення - true, то збільшуємо швидкість повороту. Якщо false, то навпаки зменшуємо (створюючи ефект "гальмування" камери). В кінці "повертаємо" по y (тобто задаємо y для m_rot)
Model List Правити
Ми будемо виводити 300 об'єктів в випадкових позиціях. Можна було б створити 300 примірників мешів, але замість цього ми завантажимо тільки один меш і створимо 300 характеристик. Тобто клас ModelList буде містити позиції 300 об'єктів.
У Init () ми передаємо кількість об'єктів. GetModelCount () буде повертати це число. GetData () буде повертати позицію об'єкта розташованого по index.
Frustum Правити
ConstructFrustum () буде оновлювати frustum. Решта методи будуть виконувати перевірку знаходження точки / куба / сфери / прямокутника в frustum.
Оновлюємо площині frustum.
MyRender Правити
Тут ми вказуємо що майбутній клас MyInput відповідає за обробку введення, буде одним рендеру. Потім створюємо екземпляри всіх потрібних класів. Об'єкт ми створили як StaticMesh. m_leftcam і m_rightcam будуть використовуватися MyInput і передаватимуть камері події натискання кнопок.
Звідси розглянемо тільки один шматок:
Спочатку конструюємо (або оновлюємо) frustum. 1000.0f - це найдальша координата по z. Також ми передаємо проекційну матрицю і видову отриману з камери. Потім запускаємо цикл для малювання 300 об'єктів. Але перед тим як малювати, перевіряємо, а чи знаходиться об'єкт в зоні піраміди. Якщо так, то малюємо.
MyInput Правити
Останній клас. Натискаючи клавішу вліво і вправо, ми будемо повертати камеру.