|
3D-программирование Вопросы, касающиеся программирования 3D мира |
21.09.2005, 04:39
|
#1
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
1. Я долго думал, чем игры созданные на DerectX 9 отличаются от игр созданных на DerectX 7. Кто-то может ответить на этот вопрос, что в DerectX 9 лучше графика, но по моему графику делают в 3D приложениях и DerectX от этого не зависит. Ну короче говоря скажите чем они отличаются???
2.И правда ли, что если создавать код в блитз3Д функциями, он будет работать быстрее, чем простой без функцией???
|
(Offline)
|
|
21.09.2005, 05:32
|
#2
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
попробую ответить...
DirectX... на самом деле, чтоб запрограммировать элементарное отображение кубика на экране (3Д), нужно гораааздо больше писанины чем мы пишем на блице... DirectX это так называемый драйвер для отображения 2Д и 3Д на экране, для обслуживания игровых устройств и вывода звука. таким образом можно проследить такую последовательность прохода команд для отображения чегонить на экране: Блиц - DirectX - Драйвер видеокарты - видеокарта - монитор.
На счет того, чем 9-я версия лучше, чем 7-я я ответить не возьмусь, предположительно там какието ошибки исправили, появилась поддержка новых видеокарт (с новыми функциями), добавилось сервиса (набор команд)...
про Функции это тебе кто-то подлым образом наврал, код будет работать быстрей если его написать без функций, потому, что на машинном уровне функции долго обрабатываются процессором, намного дольше чем простой переход, но как сейчас заведено, все программируют с использованием функций и считают это хорошим тоном... программирование функциями пошло из-за появления ООП (объектно-ориентированного программирования), где без функций никак. В блице программировать функциями необязательно, но с наличием функций программа получается немного удобочитаемей, чем без них, ну и конечно есть такие моменты, когда без функций очень трудно обойтись, например рекурсия...
если ты имеешь ввиду использование системных функций по отношению к самонаписанным, то системные выигрывают (хотя и не всегда), потому, что наминаписанные функции неоптимизированы на уровне ассемблера.
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
21.09.2005, 08:51
|
#3
|
|
directx 7 и directx9 - ихние отличия можно сопоставить с отличиями windows 98 с windows xp ... а написать реально чем они отличаются - слишком долго и нудно
ps. программируемые конвееры, улутчены работа с буферами, расширение команд, несколько фич всяких там mapingов и тд
|
|
|
21.09.2005, 12:20
|
#4
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
1.Ну я тоже так думал, что с функциями работать будет хуже,просто меня смутила 1 вещь - очень много народу программирует функциям,но теперь я понел почему. )
2.Ну я тоже понял приблезитнльную разницу.
СПАСИБО ЗА ОТВЕТЫ!
|
(Offline)
|
|
21.09.2005, 17:34
|
#5
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
"программируют функциями" - круто сказал!
Я все же советую тебе использовать функции:
1. как сказал SubZer0 - читать код проще будет, а значит и возможные ошибки легче найти при возникновении
2. код становится более универсальным, т.е. если у тебя есть части проги, которые делают одно и то же, то заново переписывать смысла особого нет, а тут вызвал функцию - и все
3. функциями как законченными кусками проги всегда можно поделиться с товарищами, а обычный кусок кода - совсем другая тема...
Не передумал? - Дело твое...
|
(Offline)
|
|
21.09.2005, 19:00
|
#6
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
Хочу еще вот что сказать (хотя эту тему мы уже обсуждали):
Мне нравится когда люди говорят как хороши функции и как они полезны а сами творят следующее:
есть такой физический движок для Блица ODE... лежит тут, скачайте его, откройте архив... там в каталоге sample есть файл ode_tutorial_03_01.bb сожержимое файла позволю себе опубликовать:
;-----------------------------;
; BlitzODE ARKON Wrapper 0.5b;
; Tutorial 3 ;
;-----------------------------;
Const LENGTH# = 0.7 * 8
Const WIDTH# = 0.5 * 8
Const HEIGHT# = 0.2 * 8
Const RADIUS# = .16 * 8
Const STARTZ# = 5 + .5 * 8
Const CMASS# = 50
Const WMASS# = 10
Include "BlitzODE.bb"
;------ Initialize Graphics --------
Graphics3D 800, 600
SetBuffer BackBuffer()
SetFont LoadFont("Arial", 14, 1, 1, 0)
cam = CreateCamera()
PositionEntity cam, -10, 20, 0
lh = CreateLight()
PositionEntity lh, 100, 100, 100
RotateEntity lh, 90, 0, 0
LightColor lh, 100, 100, 100
AmbientLight 50, 50, 50
plane = CreatePlane()
;mirror = CreateMirror(plane)
EntityColor plane, 0, 0, 150
EntityAlpha plane, .8
SeedRnd MilliSecs()
;--------- Initialize ODE ----------
Global space = ODE_dWorldCreate(0)
;---- Setting contact parameters ---
ODE_dSetContactMode(dContactBounce)
ODE_dSetMU(40); Friction
;ODE_dWorldSetCFM(0.00001)
;-------- Create many box ---------
For i = 1 To 10
g.TODEGeom = New TODEGeom
g\body = ODE_dBodyCreate()
g\geom = ODE_dCreateBox(space, 2, 2, 2, 10)
ODE_dGeomSetBody g\geom, g\body
ODE_dBodySetPosition(g\body, Rnd(-35, 35), Rnd(15, 25), Rnd(-35, 35))
ODE_dBodySetRotation(g\body, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180))
g\mesh = CreateCube()
EntityColor g\mesh, Rand(255), Rand(255), Rand(255)
EntityShininess g\mesh, 0.7
Next
;------- Create many balls ---------
For i = 1 To 10
g.TODEGeom = New TODEGeom
g\body = ODE_dBodyCreate()
g\geom = ODE_dCreateSphere(space, 1, 10)
ODE_dGeomSetBody g\geom, g\body
ODE_dBodySetPosition(g\body, Rnd(-35, 35), Rnd(15, 25), Rnd(-35, 35))
ODE_dBodySetRotation(g\body, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180))
g\mesh = CreateSphere()
EntityColor g\mesh, Rand(255), Rand(255), Rand(255)
EntityShininess g\mesh, 0.7
Next
;------- Create fixed box ----------
geom = ODE_dCreateBox(space, 15, .1, 15, 10)
ODE_dGeomSetPosition(geom, 20, 2.5, 0)
ODE_dGeomSetRotation(geom, 0, 0, 20)
mesh = CreateCube()
PositionEntity mesh, 20, 2.5, 0
RotateEntity mesh, 0, 0, 20
ScaleMesh mesh, .5, .05, .5
ScaleEntity mesh, 15, 1, 15
;-----------------------------------
Function AddCCylinder()
r# = Rnd(0.4, 2)
h# = Rnd(r / 2.0, r / 2.0 + 2.5)
cr = Rand(255)
cg = Rand(255)
cb = Rand(255)
g.TODEGeom = New TODEGeom
g\body = ODE_dBodyCreate()
g\geom = ODE_dCreateCCylinder(space, r, h * 2, 1)
ODE_dGeomSetBody(g\geom, g\body)
g\mesh = CreatePivot()
cl = CreateCylinder(8, 1, g\mesh)
RotateEntity cl, 90, 0, 0
EntityColor cl, cr, cg, cb
ScaleEntity cl, r, h, r
sh1 = CreateSphere(8, g\mesh)
ScaleEntity sh1, r, r, r
PositionEntity sh1, 0, 0, h
EntityColor sh1, cr, cg, cb
sh1 = CreateSphere(8, g\mesh)
ScaleEntity sh1, r, r, r
PositionEntity sh1, 0, 0, -h
EntityColor sh1, cr, cg, cb
px# = Rnd(-60, 60)
py# = Rnd(15, 40)
pz# = Rnd(-60, 60)
ax# = Rnd(-180, 180)
ay# = Rnd(-180, 180)
az# = Rnd(-180, 180)
ODE_dBodySetPosition(g\body, px#, py#, pz#)
ODE_dBodySetRotation(g\body, ax#, ay#, az#)
PositionEntity g\mesh, px#, py#, pz#
RotateEntity g\mesh, ax#, ay#, az#
gCount = gCount + 1
End Function
For i = 1 To 20
AddCCYlinder()
Next
Global cbody%[5], joint%[4], box%[1], sphere%[4]
;----------- Crete CAR -------------
;Car body
cbody[0] = ODE_dBodyCreate()
ODE_dBodySetPosition(cbody[0], 0, STARTZ, 0)
box[0] = ODE_dCreateBox(0, LENGTH, HEIGHT, WIDTH, CMASS)
ODE_dGeomSetBody(box[0], cbody[0])
g.TODEGeom = New TODEGeom
g\body = cbody[0]
g\geom = box[0]
g\mesh = CreateCube()
EntityColor g\mesh, 255, 255, 0
CAR = g\mesh
ScaleMesh g\mesh, .5, .5, .5
ScaleEntity g\mesh, LENGTH, HEIGHT, WIDTH
ODE_dBodySetMass(cbody[0], CMASS)
ODE_dBodyTranslateMass(cbody[0], 0, -1, 0)
;Car wheels
For i = 1 To 4
cbody[i] = ODE_dBodyCreate()
ODE_dBodySetRotation(cbody[i], 90, 0, 0)
sphere[i - 1] = ODE_dCreateSphere(0, RADIUS, WMASS)
ODE_dGeomSetBody(sphere[i - 1], cbody[i])
g.TODEGeom = New TODEGeom
g\body = cbody[i]
g\geom = sphere[i - 1]
g\mesh = CreateCylinder(16)
ScaleEntity g\mesh, RADIUS, RADIUS * .2, RADIUS
EntityColor g\mesh, 20, 0, 0
ODE_dBodySetMass(cbody[i], WMASS)
Next
ODE_dBodySetPosition (cbody[1],0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,WIDTH*0.5);
ODE_dBodySetPosition (cbody[2],0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,-WIDTH*0.5);
ODE_dBodySetPosition (cbody[3],-0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5, WIDTH*0.5);
ODE_dBodySetPosition (cbody[4],-0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,-WIDTH*0.5);
For i = 0 To 3
joint[i] = ODE_dJointCreateHinge2()
ODE_dJointAttach(joint[i], cbody[0], cbody[i + 1])
ODE_dJointSetHinge2Anchor(joint[i], ODE_dBodyGetPositionX(cbody[i + 1]), ODE_dBodyGetPositionY(cbody[i + 1]), ODE_dBodyGetPositionZ(cbody[i + 1]))
ODE_dJointSetHinge2Axis1 (joint[i],0,1,0)
ODE_dJointSetHinge2Axis2 (joint[i],0,0,1)
Next
For i = 0 To 3
ODE_dJointSetHinge2Param(joint[i], dParamSuspensionERP, .3)
ODE_dJointSetHinge2Param(joint[i], dParamSuspensionCFM, .065)
Next
For i = 2 To 3
ODE_dJointSetHinge2Param(joint[i],dParamLoStop,0)
ODE_dJointSetHinge2Param(joint[i],dParamHiStop,0)
Next
ODE_dBodySetPosition cbody[0], 0, 5, 0
car_space% = ODE_dSimpleSpaceCreate(space)
ODE_dSpaceAdd(car_space, box[0])
For i = 1 To 4
ODE_dSpaceAdd(car_space, sphere[i - 1])
Next
speed# = .1
CreateTriMesh()
;------------------------------------------
ODE_UpdateGeoms()
;-----------------------------------
gameFPS = 50.0
framePeriod = 1000 / gameFPS
frameTime = MilliSecs () - framePeriod
While Not KeyHit(1)
Repeat
frameElapsed = MilliSecs () - frameTime
Until frameElapsed
frameTicks = frameElapsed / framePeriod
frameTween# = Float(frameElapsed Mod framePeriod) / Float(framePeriod)
For frameLimit = 1 To frameTicks
If frameLimit = frameTicks Then CaptureWorld
frameTime = frameTime + framePeriod
;------------ Add Force and Torque ----------
If KeyHit(57)
For g.TODEGeom = Each TODEGeom
ODE_dBodyEnable g\body
ODE_dBodyAddForce g\body, 0, Rnd(20, 50), 0
ODE_dBodyAddTorque g\body, Rnd(-10, 10), Rnd(-10, 10), Rnd(-10, 10)
Next
EndIf
;-------------- Update car physics ------------
If KeyDown(200)
speed# = speed# + .1
ElseIf KeyDown(208)
speed# = speed# - .1
EndIf
If Abs(speed) > .01
speed# = speed# * .95
EndIf
If KeyDown(203)
If steer# < .75 steer# = steer# + .05
ElseIf KeyDown(205)
If steer# > -.75 steer# = steer# - .05
Else
steer# = steer# * .95
EndIf
For i = 0 To 3
ODE_dJointSetHinge2Param(joint[i],dParamVel2, speed# * 12)
ODE_dJointSetHinge2Param(joint[i],dParamFMax2, 20.0)
Next
v# = steer# - ODE_dJointGetHinge2Angle1(joint[0])
v = v * 11.0
v1# = steer# - ODE_dJointGetHinge2Angle1(joint[1])
v1 = v1 * 11.0
ODE_dJointSetHinge2Param (joint[0],dParamVel,v)
ODE_dJointSetHinge2Param (joint[0],dParamFMax, 50)
ODE_dJointSetHinge2Param (joint[0],dParamLoStop,-0.75)
ODE_dJointSetHinge2Param (joint[0],dParamHiStop,0.75)
ODE_dJointSetHinge2Param (joint[1],dParamVel,v1)
ODE_dJointSetHinge2Param (joint[1],dParamFMax, 50)
ODE_dJointSetHinge2Param (joint[1],dParamLoStop,-0.75)
ODE_dJointSetHinge2Param (joint[1],dParamHiStop,0.75)
PointEntity cam, car
;------------ Update physics world ----------
tm = MilliSecs()
ODE_dWorldQuickStep 0.1
pTime = MilliSecs() - tm
;---------- Fix car angular momuntum --------
For i = 1 To 4
ax# = ODE_dBodyGetAngularVelX(cbody[i]) * .998
ay# = ODE_dBodyGetAngularVelY(cbody[i]) * .9
az# = ODE_dBodyGetAngularVelZ(cbody[i]) * .998
ODE_dBodySetAngularVel(cbody[i], ax#, ay#, az#)
Next
ax# = ODE_dBodyGetAngularVelX(cbody[0]) * .7
ay# = ODE_dBodyGetAngularVelY(cbody[0]) * .8
az# = ODE_dBodyGetAngularVelZ(cbody[0]) * .7
ODE_dBodySetAngularVel(cbody[0], ax#, ay#, az#)
Next
;---- Set geometry position and rotation ----
ODE_UpdateGeoms()
;--------------------------------------------
RenderWorld frameTween#
; FPS counter
fr = fr + 1
If MilliSecs() - frTime >= 1000
fps = fr
fr = 0
frTime = MilliSecs()
EndIf
Color 255, 255, 255
Text 5, 5, "FPS " + fps
Text 5, 20, "Physics time " + pTime
Text 5, 580, "Space - Add Force and Torque"
Flip 0
Wend
ODE_dCloseODE()
End
Function CreateTriMesh()
mesh = LoadMesh("002.b3d")
ScaleEntity mesh, 1, 1, 1
TriMesh = ODE_dTriMeshCreate(mesh)
tex = CreateTexture(32, 32, 8)
SetBuffer TextureBuffer(tex)
ClsColor 0, 0, 100
Cls
Color 255, 255, 0
Rect 0, 0, 31, 31, 0
Rect 1, 1, 29, 29, 0
ScaleTexture tex, .025, .025
EntityTexture mesh, tex
SetBuffer BackBuffer()
End Function
смотрим внимательно на код, здесь использование функции AddCCylinder было крайне нобходимо неправда-ли?
пойдем по всем пунктам указанным Жекой:
1. удобочитаемость от этого ну прямо жутко улучшилась...
2. эта функция больше НИГДЕ не вызывалась
3. эта функция является НЕПЕРЕНОСИМОЙ потому, что для каждого случая пришлось бы переписывать ее заново, поскольку она не принимает никаких параметров, т.е. эта функция очень узкоспециализирована (имеется ввиду размер, цвет, позиция и угол)...
я говорил вот про такие случаи...
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
21.09.2005, 20:03
|
#7
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Тяжелый случай...
От темы отошли... А раз так, то: я все тела функций пишу после команды End, т.е. после всего. В этом случае не приходится смотреть на те функции, которые не нужны при написании: понадобилась функция - нажал на ее имя в списке справа (в редакторе кода), они типа независимы получаются... и основной код не засоряют....
|
(Offline)
|
|
21.09.2005, 20:47
|
#8
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Originally posted by SubZer0@Sep 21 2005, 03:32 AM
программа получается немного удобочитаемей, чем без них
|
естественно подразумевалось
программа получается намного удобочитаемей, чем без них
|
исправляю досадную опечатку
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
21.09.2005, 21:06
|
#9
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
Originally posted by impersonalis+Sep 21 2005, 06:47 PM--><div class='quotetop'>ЦИТАТА(impersonalis @ Sep 21 2005, 06:47 PM)</div><div class='quotemain'>
Originally posted by SubZer0@Sep 21 2005, 03:32 AM
программа получается немного удобочитаемей, чем без них
|
естественно подразумевалось
программа получается намного удобочитаемей, чем без них
|
исправляю досадную опечатку [/b]
|
в свете вот этого:
<!--QuoteBegin-SubZer0@Sep 21 2005, 05:00 PM
смотрим внимательно на код....., здесь использование функции было крайне нобходимо неправда-ли?
пойдем по всем пунктам..
1. удобочитаемость от этого ну прямо жутко улучшилась...
2. эта функция больше НИГДЕ не вызывалась
3. эта функция является НЕПЕРЕНОСИМОЙ потому, что для каждого случая пришлось бы переписывать ее заново, поскольку она не принимает никаких параметров, т.е. эта функция очень узкоспециализирована (имеется ввиду размер, цвет, позиция и угол)...[/quote]
опечатка и правда досадная
ЗЫ извиняюсь перед xxxKRIKxxx, за ненужный спор в топике
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:36.
|