|
Кто разбирается в компьютерной графике, помогите с искажениями. | ☑ | ||
---|---|---|---|---|
0
SweetaAngel
05.11.22
✎
18:38
|
Пишу дум на 1С и что-то искажения не нравятся.
Расстояние по косинусу нормирую: чЁРасстояниеНормКос = чЁРасстояние * чЁКосНормТрассера; — но все равно какие-то волны, то бочки. Размер вроде должно пропорционально расстоянию. Но если расстояние меньше единицы, то размер предмета большой получается попробовал пропорционально (1 + чЁРасстояниеНормКос) — чЁВысотаСтенки = Объект.чЁВысотаРезультата / (1 + чЁРасстояниеНормКос); Но все равно когда ближе единицы результата не нравится. Вот обработка на УФ: https://disk.yandex.com/d/1GZA30Xe8oagqQ Рисование обоев: https://disk.yandex.com/d/rGXwCf03wJstzg — может обои по лучше предложите. Помогите покрасившие сделать. |
|||
1
2S
05.11.22
✎
18:57
|
Честно, завидую наличию у Вас свободного времени
|
|||
2
SweetaAngel
05.11.22
✎
19:06
|
(1)
1. Так праздники же. Там кода 737 строк, и много копированием. 2. Это для дела. |
|||
3
RomanYS
05.11.22
✎
19:27
|
(0) блин, лучше бы svg поковырял)
|
|||
4
s-n-a-y
05.11.22
✎
19:32
|
(0) Для оптимизации можно ещё предрассчитанные таблицы синусов/косинусов использовать
|
|||
5
SweetaAngel
05.11.22
✎
19:33
|
(3) смотря какие цели.
|
|||
6
SweetaAngel
05.11.22
✎
19:38
|
(4) да оно вроде не тормозит. А если и тормозит то на выводе.
Я пробовал рисовать занося сначала картинку в массив, а потом массив на табдок. Разрешение типа цга — 320х200 заполнено , допустим, 1000 точек и только они выводятся на ТабДок, если не заполнено то и не трогает. Так система висла на переборе 64 000 элементов массива. А если в данной обработке поставить: выводить надпись так тормоза начнутся. Причем обновление заголовка в одной итерации с обновлением карты и экрана. |
|||
7
RomanYS
05.11.22
✎
19:40
|
(4) нет никакого смысла оптимизировать расчеты, если в табдоке красить 10к ячеек
|
|||
8
RomanYS
05.11.22
✎
19:52
|
(0) О! Открыл Дум, прикольно конечно. А зачем нормирование расстояния. По идее каждый пиксель это луч на определенный угол, или каждый пиксель нельзя просчитать?
|
|||
9
SweetaAngel
05.11.22
✎
20:04
|
(8) так мозг у человека работает. Глаз вообще перевернутую картинку мозгу транслирует, там даже пары линз как в примитивном объективе нет. Не говоря про асферические линзы. Но если ты смотришь прямо на стену она для тебя прямая, хотя точка перед тобой ближе чем точки по бокам. Умножая на косинус угла мы приравниваем косые гипотинузы в бок к катету который сответствует взгляду перед собой. Т.е. когда градус отклонение от прямого взгляда 0 косинус единица чем больше угол тем дальше точка и расточние до нее равно гипотинузе угла отклонения от прямого взгляда.
|
|||
10
RomanYS
05.11.22
✎
20:26
|
(9) только на плоской картинке мы расстояние не видим. Нормирование наверное нужно, чтобы учесть поправки на освещенность. Ну и сетка углов соответствующих пикселям может быть не равномерной, тут согласен.
|
|||
11
SweetaAngel
05.11.22
✎
20:54
|
(10) если ты смотришь прямо на стену то ты и не должен видеть объем
|
|||
12
SweetaAngel
05.11.22
✎
22:21
|
(10)
Вот такую картинку Глаз передает Мозгу https://disk.yandex.com/i/1xz057KQ5tljew Вот такую картинку Мозг передает личности в лобные доли: https://disk.yandex.com/i/nEn_tK2aDVTkrQ На самом деле все еще круче и глаз части изображения не видит и сшивает дырку: https://disk.yandex.com/i/ccFdd4kkcbiuJQ — закрой правый глаз и посмотри илевым глазом на правый крестик в круге. Так вот трассировка видит расстояние "как есть". Поэтому нужно её поправить: https://disk.yandex.com/i/xnMom-bMyiWtiA |
|||
13
RomanYS
05.11.22
✎
22:38
|
(12) По последней картинке: и куда ты денешь эту поправку и расстояние вообще? Ты просто в заданном пикселе покажешь цвет точки C, расстояние до нее ты никак передать не можешь
|
|||
14
SweetaAngel
05.11.22
✎
22:43
|
(13) Высота её определяет высоту стены. Высота сетный обратно пропорционально расстоянию. Чем дальше тем меньше стенка. чЁВысотаСтенки = Объект.чЁВысотаРезультата / (1 + чЁРасстояниеНормКос);
https://damion.club/uploads/posts/2022-09/thumbs/1663208265_1-damion-club-p-perspektiva-risunok-risunki-1.jpg — чем дальше дерево тем меньше но если деревья стоят перед тобой в ряд они одной высоты: https://studfile.net/html/2706/201/html_7MymOkq1Xm.Aqs4/img-INDikb.png — хотя вроде те деревья которые по центру ближе к тебе чем те которые по краям |
|||
15
SweetaAngel
05.11.22
✎
22:46
|
(14) "Высота её определяет высоту стены. " — Расстояние её определяет высоту стены.
|
|||
16
Garykom
гуру
05.11.22
✎
23:22
|
||||
17
Garykom
гуру
05.11.22
✎
23:27
|
(16)+ это как пример где инфу искать, там только одна 1995 по теме
сейчас уже не помню по какой литературе изучал в свое время, давно было но там самый лучший учебник по комп.графике на удивление был где о компьютерах ни слова, только куча формул и преобразований с картинками |
|||
18
SweetaAngel
05.11.22
✎
23:46
|
||||
19
RomanYS
06.11.22
✎
00:35
|
(14) зачем считать высоту стенки, если можно просто получить её проекцию на экран
|
|||
20
SweetaAngel
06.11.22
✎
01:40
|
(19) Это как? Боюсь, что не понимаю.
|
|||
21
RomanYS
06.11.22
✎
11:41
|
(20) ну по горизонтали ты считаешь проекции, собственно это у тебя даже визуализировано в левой части формы. Тоже самое делать по вертикали.
|
|||
22
SweetaAngel
06.11.22
✎
13:55
|
(21) Я считаю пересечения трассера и с горизонталями и с вертикалями. А потом выбираю кто ближе. И по этому расстоянию считаю высоту стенку.
чРастояниеПоХ = Sqrt( (чЁТекСтолбецПоХ - Объект.чЁПозХНаКарте) * (чЁТекСтолбецПоХ - Объект.чЁПозХНаКарте) + (чЁТекСтрокаПоХвУ - Объект.чЁПозУНаКарте) * (чЁТекСтрокаПоХвУ - Объект.чЁПозУНаКарте) ); чРастояниеПоУ = Sqrt( (чЁТекСтолбецПоУвХ - Объект.чЁПозХНаКарте) * (чЁТекСтолбецПоУвХ - Объект.чЁПозХНаКарте) + (чЁТекСтрокаПоУ - Объект.чЁПозУНаКарте) * (чЁТекСтрокаПоУ - Объект.чЁПозУНаКарте) ); чЁРасстояние = Мин(чРастояниеПоХ, чРастояниеПоУ); чЁРасстояниеНормКос = чЁРасстояние * чЁКосНормТрассера; |
|||
23
RomanYS
06.11.22
✎
14:01
|
(22) >> А потом выбираю кто ближе.
Вот здесь и определится, что ты увидишь по данному лучу: если ближе "по x" - стену, "по y" - потолок |
|||
24
Mort
06.11.22
✎
14:08
|
(22) Нужно расстояние не от глаз мерять, а от проекции на экран.
|
|||
25
Mort
06.11.22
✎
14:16
|
Поэтому у тебя в функции ЁВывестиРезультат номер столбца пропорционален углу, словно ты проецируешь на вогнутый экран. А должен быть пропорционален тангенсу, где ближний катет расстояние от глаз до экрана, а дальний расстояние от центра экрана до столбца.
Писал ровно то же самое лет 20 назад и не на 1С. |
|||
26
Mort
06.11.22
✎
14:22
|
||||
27
SweetaAngel
06.11.22
✎
14:24
|
(25) Что произойдет если глаз окажется к стене ближе чем расстояния от глаза до экрана т.е. воображаемый экран уйдет в стену?
|
|||
28
RomanYS
06.11.22
✎
14:28
|
(27) ничего не произойдёт, просто стена будет крупнее
|
|||
29
Mort
06.11.22
✎
14:29
|
(27) Классическое проваливание за текстуру, как во многих играх бывает. А вообще для этого на персонажа назначают толстый физические коллайдер, чтобы он не мог вплотную к стенке подойти.
|
|||
30
Mort
06.11.22
✎
14:38
|
Впрочем с таким методом "рендеринга" такого эффекта не будет.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |