Я знаю, как строить 2D-функции, но я борюсь с 3D-функциями.
Каков наилучший способ построения 3D-функций?Что мне нужно и с чего мне начать?
Я не ищу код или внешние библиотеки, которые выполняют всю работу, мне просто нужно знать, что мне нужно, чтобы научиться делать это самому.
Поскольку вы уже понимаете 2D и хотите перейти к 3D, существует простой и неоптимальный метод:
Определите, сколько z желаемая глубина:
EG: В настоящее время ваши ограничения для x и y в ваших функциях рисования составляют 1920 и 1080 (или даже 4096x4096), если вы хотите сэкономить память и иметь вещинемного низкое разрешение - 1920x1080x1000 - это будет использовать в 1000 раз больше памяти и иметь потенциал для увеличения времени прорисовки некоторых вызовов в 1000 раз- но это стоимость 3D.
Более практичный предел - это матрицы 8192,8192,16384, но имейте в виду, что для видеоигр с таким разрешением нужны графические карты 4-6 ГБ. работать наполовину прилично (больше быть лучше) - so вы будете жевать некоторую основную память, начиная с этого размера.
Достаточно легко реализовать меньшее пространство для рисования и просто увеличить выделение и ограничить переменные позже, не только этот тест на будущее увеличение пойдетплавно, но это позволяет все работать быстрее, пока вы исправляете ошибки.
Добавьте 3-е измерение к функциям:
EG: вместо функции, котораяпросто line_draw (x, y), измените его на line_draw (x, y, z), используйте глобальную переменную z_limit (или как вы ее называете), чтобы проверить, что z не превышает ограничение.
Вам нужно решить, являются ли объекты на максимальном расстоянии точкой или не видны.При тестировании, когда все z прошли, ограничение, измененное на предельное значение (таким образом, делая их видимой точкой), полезно.Для готового продукта, когда он превышает предел, который вы реализуете, лучше всего, чтобы он не был виден.
Начните с выделения буфера чертежа и реализации одной функции в первую очередь, нетТочка (и, возможно, большое разочарование) меняет все и надеется, что это просто сработает - это должно , но если этого не произойдет, у вас будет много на вашей тарелке, если в каждой функции будет общая ошибка.
Как только вы заполнили этот 3D-буфер изображением (начните с нескольких 3D-линий, например, полноэкранного размера «X» и «+»), которые вы рисуете на свой 2D-экранX, Y, начиная с наибольшее значение Z сначала (например: z = 1000).Как только вы закончите этот слой, уменьшите z и продолжайте рисовать каждый слой, пока не достигнете нуля, ближайших к вам объектов.
Это самый простой (и самый медленный) способ убедиться, что ближайшие объекты скрывают самые дальние объекты.
Теперь все выглядит нормально?Вы не хотите, чтобы удаленные объекты были того же размера (или больше), что и ближайшие объекты, вы должны убедиться, что вы масштабируете их.
Причина выбора чисел, таких как 8192, заключается в том, что после написав свои функции на C (или на любом другом языке), вы захотите оптимизировать их с помощью нескольких версий каждая , написанных на языке ассемблера, оптимизированных для конкретных процессоров и архитектур графических процессоров.,Без специально оптимизированных версий все будет очень медленно.
Я понимаю, что вы не хотите использовать библиотеку , но просмотр нескольких должен дать вам представление о проделанной работе и о том, как выможет реализовать свой собственный.Не нужно копировать, улучшать вместо этого.
Есть похожие вопросы и ответы, которые могут заполнить пробелы:
Reddit - " Я хочу создать 3D-движок с нуля. Гденачать?"
Davrous - " Серия учебников: обучение написанию трехмерного программного движка с нуля на C #, TypeScript или JavaScript "
GameDev.StackExchange - " Как написать мойсобственная библиотека трехмерной графики для Windows? [закрыто]"