forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Несколько вопросов (http://forum.boolean.name/showthread.php?t=14891)

Hagrael 14.06.2011 14:13

Несколько вопросов
 
Здравствуйте еще раз, форумчане. Буду вам признателен, если вы ответите мне на возникшие вопросы.

1) В функции AnimateMD2 третий параметр - скорость анимации. Как я понимаю, число кадров в секунду будет равно скорости, умноженной на 25?

2) Это из 2D-мира. Функция MouseXSpeed() в следующем коде:
Код:

Repeat

Print MouseXSpeed()
Print MouseXSpeed()
WaitKey()

Until KeyHit(1)

возвращает вначале n-е число, а после 0. Почему? И в чем выражается эта скорость? В пикселях?

3) Третий вопрос. Чему равна единица пространства? Она не совпадает с величиной, указанной в редакторе или же совпадает?

4) Вопрос касается буферизации. Вот код:
Код:

Graphics3D 400, 200

If GraphicsBuffer()=BackBuffer() Then
        Print "YES"
        WaitKey()
EndIf

camera=CreateCamera()

cube=CreateCube()
PositionEntity cube, 0, 0, 5

RenderWorld

WaitKey()

Пишет "YES" и ждет клавиши. Ничего не происходит. Снова жмешь клавишу, и программа отключается. Все логично: Graphics3D ставит в текущий буфер задний буфер, а текст автоматически выводится в передний буфер. Однако вот такой код:
Код:

Graphics3D 400, 200

camera=CreateCamera()

cube=CreateCube()
PositionEntity cube, 0, 0, 5

RenderWorld

WaitKey()

рисует мне куб! Но как так! RenderWorld-то по идее рендерит задний буфер! А Flip-ом тут и не пахнет. В чем дело?

5) Пожалуйста, поправьте меня, если я что-то не так скажу. Ширина и высота камеры устанавливаются равными ширине и высоте графического режима. Координаты камеры - это точка, в которой находится ее центр. Ортографическая проекция рендерится быстрее, чем перспективная.

Прошу прощения за большое количество вопросов.

RegIon 14.06.2011 14:37

Ответ: Несколько вопросов
 
Вложений: 1
Цитата:

возвращает вначале n-е число, а после 0. Почему? И в чем выражается эта скорость? В пикселях?
скорость -1.0-0.0-1.0 хз в чем,чем быстрей двигаешь мышь-тем быстрей скорость,но не как не больше/меньше 1/-1
Цитата:

1) В функции AnimateMD2 третий параметр - скорость анимации. Как я понимаю, число кадров в секунду будет равно скорости, умноженной на 25?
да,если в максе за 1 секу делать 25 кадров-так же и в блитзе будет(не используй md2)
Цитата:

3) Третий вопрос. Чему равна единица пространства? Она не совпадает с величиной, указанной в редакторе или же совпадает?
ммм.вроде совпадает,я делаю меши-совпадает..
Цитата:

рисует мне куб! Но как так! RenderWorld-то по идее рендерит задний буфер! А Flip-ом тут и не пахнет. В чем дело?
ммм,косяк...не рендрится,И НЕ БУДЕТ....flip а нет..
мммм.НЕ МОЖЕТ ТАК БЫТЬ:народ,объясните МНЕ как такое может быть....с первого раза рендера не было,стоит раз буфер инициализировать(фронтальный) так всегда потом рендер--хоть закрой прогу,хоть нет:Вложение 14060
Цитата:

Ширина и высота камеры устанавливаются равными ширине и высоте графического режима.
камера-точка с которой рендер,она указывает пропорции изображения для рендра на экран,чем меньше камера-тем БОЛЬШЕ изображение(обьекты...) КООРДИНАТЫ камеры=координаты точки начала просчета рендра
---кто лучше знает,объясните.....

impersonalis 14.06.2011 14:49

Ответ: Несколько вопросов
 
Цитата:

Сообщение от Hagrael (Сообщение 191470)

2) Это из 2D-мира. Функция MouseXSpeed() в следующем коде:
Код:

Repeat

Print MouseXSpeed()
Print MouseXSpeed()
WaitKey()

Until KeyHit(1)

возвращает вначале n-е число, а после 0. Почему?

Вторая скорость - скорость мыши между двумя вызывами функции. А на вряд ли ты успеешь подвигать мышь за время менее 1 мс.
V=(x2-x1)/t
(x2-x1)->0 => V->0

ps: http://forum.boolean.name/forumdisplay.php?f=37

RegIon 14.06.2011 14:52

Ответ: Несколько вопросов
 
Цитата:

Вторая скорость - скорость мыши между двумя вызывами функции. А на вряд ли ты успеешь подвигать мышь за время менее 1 мс.
V=(x2-x1)/t
(x2-x1)->0 => V->0
нум можно если захотеть...

Hagrael 14.06.2011 15:35

Ответ: Несколько вопросов
 
Спасибо, Костян.

Так значит x1 устанавливается равным x2 после выполнения функции. Ну а если ты вызвал функцию в первый раз? Или подождав очень долгое время в третий раз? Тогда откуда берется x1? Я так понимаю, что скорость мыши - это количество пикселей, на которое она успела сместиться за секунду. Так что наверное хранится 1000 x-ов мыши, которые были за 0, 1, 2, 3, ... 999, 1000 мс ранее. По прохождению еще одной мс, добавляется новая координата, а самая последняя удаляется. Когда же вызывается функция MouseXSpeed, то все все координаты стираются, и в конец (0 мс) добавляется текущая координата. Действительно все делается так?

Касатально 4-го вопроса, связанного с буферизацией. Вот такой код:
Код:

Graphics3D 400, 200

camera=CreateCamera()

cube=CreateCube()
PositionEntity cube, 0, 0, 5

RenderWorld ; Flip

WaitKey()

End

что с Flip-ом, что без выдаст тебе куб. Вот в этом заключается часть магии. Оставшаяся часть магии в том, что при таком коде:
Код:

Graphics3D 400, 200

camera=CreateCamera()

cube=CreateCube()
PositionEntity cube, 0, 0, 5

Print 1

RenderWorld

WaitKey()

цифра после рендеринга исчазает (ее ты и не успеваешь увидеть). А вот при таком коде:
Код:

Graphics3D 400, 200

camera=CreateCamera()

cube=CreateCube()
PositionEntity cube, 0, 0, 5

If GraphicsBuffer()=BackBuffer() Then
        Print 1
        WaitKey()
EndIf

RenderWorld

WaitKey()

цифра не исчезает! После однократного нажатия ничего не происходит, а после двукратного программа завершается. Волшебство!

moka 14.06.2011 15:43

Ответ: Несколько вопросов
 
Используй SetBuffer()

Отрисовка 2D (текста и т.п.), вызывай после RenderWorld и перед Flip'ом.

Hagrael 14.06.2011 15:48

Ответ: Несколько вопросов
 
Выяснил, что эта B3D-единица зависит от ширины приложения и никак не зависит от его высоты. Видно, находится она по какой-то формуле. Родился новые вопрос:

Как узнать размеры объекта в единицах B3D и пикселях?

Hagrael 14.06.2011 16:04

Ответ: Несколько вопросов
 
И еще один:

Как сделать так, чтобы текстура не повторялась?

moka 14.06.2011 16:04

Ответ: Несколько вопросов
 
Это 3D. Он ни как не соотносится к пикселям.
Используя матрицы проекции (камеры), идёт преобразование 3D в 2D - на экран.
От разрешения это не зависит.
Нету соотношения. Можно вычислить размер объекта на экране но это математика и работа с матрицами.

Зачем вообще задаёшься подобным? Что хочешь реализовать? Клик по объекту? Для этого есть CameraPick.
Читай документацию, там много есть полезного..

Hagrael 14.06.2011 16:25

Ответ: Несколько вопросов
 
Чем больше я делаю ширину, посылаемую оператору Graphics, тем больше становится куб. А вот высота куба всегда одинаковая.

А в справке не написано ничего про размеры объектов.

Hagrael 14.06.2011 18:13

Ответ: Несколько вопросов
 
Не уже ли никто не задавался подобными вопросами?

impersonalis 14.06.2011 18:23

Ответ: Несколько вопросов
 
Цитата:

Сообщение от Hagrael (Сообщение 191479)
Спасибо, Костян.

Так значит x1 устанавливается равным x2 после выполнения функции. Ну а если ты вызвал функцию в первый раз? Или подождав очень долгое время в третий раз? Тогда откуда берется x1? Я так понимаю, что скорость мыши - это количество пикселей, на которое она успела сместиться за секунду. Так что наверное хранится 1000 x-ов мыши, которые были за 0, 1, 2, 3, ... 999, 1000 мс ранее. По прохождению еще одной мс, добавляется новая координата, а самая последняя удаляется. Когда же вызывается функция MouseXSpeed, то все все координаты стираются, и в конец (0 мс) добавляется текущая координата. Действительно все делается так?

Пфффф... Скорость - 1ая производная координаты по времени. Сколько нам надо хранить координат чтобы (зная текущее состояние точки) рассчитать мгновенную сокрость? - ОДНУ.
Если ты не знал, есть ещё MouseXSpeed,MouseZSpeed

А вообще, в блитце (смотрим хелп) эти комнады возвращают не скорость, а расстояние*, пройденное курсором с момента последнего вызова.
Код:

Global mouse1%=MouseX()
MouseXSpeed()
Global mouse2%
Global ErrMax%=0
While Not KeyHit(1)
        mouse2=MouseX()
        Local v%=(mouse2-mouse1)
        Local v2%=MouseXSpeed()
        mouse1=mouse2
        If Abs(v-v2)>ErrMax
                ErrMax=Abs(v-v2)
        EndIf
        AppTitle Int(v)+" "+v2+"  er="+ErrMax
Wend
End

*- учитывая что система дискретная, и предполагая её истинную реалтаймовость (вызов функции в строго фискированное время вне зависимости от общей загруженности системы) можно сказать, что это и есть скорость: т.к. делить на 1 сек** (шаг дискретизации), тоже что и не делить.

**- секунда выбрана, как единица времени по системе СИ; шаг дискретизации подбирается программистом исходя из нужд.

***- в общем случае, аппроксимация скорости не всегда может носить такой тривальный характер (на основе определения производной).

Dzirt 14.06.2011 21:13

Ответ: Несколько вопросов
 
Имп, ему 15....ты рознесёшь ему мозг.

Hagrael 14.06.2011 21:37

Ответ: Несколько вопросов
 
Хм, и правда, нам ведь нужна скорость мыши именно в данный момент времени. Но за исключением этой вещи я все сказал правильно - когда вызывается функция MouseXSpeed, то меняется x1. Но непонятно, зачем это сделано.

impersonalis 14.06.2011 22:07

Ответ: Несколько вопросов
 
Цитата:

Сообщение от Hagrael (Сообщение 191532)
Хм, и правда, нам ведь нужна скорость мыши именно в данный момент времени. Но за исключением этой вещи я все сказал правильно - когда вызывается функция MouseXSpeed, то меняется x1. Но непонятно, зачем это сделано.

меняется и x1, и x2.
Код:

        mouse2=MouseX()
        Local v%=(mouse2-mouse1)
        Local v2%=MouseXSpeed()
        mouse1=mouse2

Касаемо буферизации: см. замечание MoKи (тут) + почитай про CameraClsMode camera,cls_color,cls_zbuffer
Код:

Graphics3D 400, 200,32,2

camera=CreateCamera()
CameraClsMode camera,False,True

cube=CreateCube()
PositionEntity cube, 0, 0, 5

Print 1

RenderWorld

WaitKey()

И всё* работает!

*-если не будет закрыто растром, представляющим проекцию трёхмерной сцены

Цитата:

Чем больше я делаю ширину, посылаемую оператору Graphics, тем больше становится куб. А вот высота куба всегда одинаковая.
ничего не ясно


Часовой пояс GMT +4, время: 03:53.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot