Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 06.08.2011, 21:40   #196
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Прикольный глюк

...
While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
timeruno=xMillisecs()
...
xRenderWorld()
xText 100,120,xMillisecs()-timeruno
...
Печатает иногда... отрицательные значения. Кроме делэя и вэйттаймера это чем-нить лечится?

Include "xors3d.bb"

Global pivot,camera,mxs#,mys#,light,timeruno#

Const BallsNumber=20
;position,speed vector
Type ball_data
Field id
Field x#
Field y#
Field z#
Field vx#
Field vy#
Field vz#
End Type

xGraphics3D(640,480, 32,0, 0)

Create_Table()
Create_Balls(BallsNumber)
pivot=xCreatePivot()
camera = xCreateCamera(pivot)
light=xCreateLight()
xPositionEntity light,200,200,200


timeruno=MilliSecs()+2
While(Not (xKeyHit(KEY_ESCAPE) Or xWinMessage("WM_CLOSE")))
timeruno=xMillisecs()

;добавление гравитации
gravitation#=0.0001
For biliard.ball_data =Each ball_data
biliard\vy=biliard\vy-gravitation
Next

;firststep
For biliard.ball_data =Each ball_data
biliard\x=biliard\x+biliard\vx
biliard\y=biliard\y+biliard\vy
biliard\z=biliard\z+biliard\vz

;сила трения

friction#=0.0001
If biliard\y>0.001 Then friction#=0
If biliard\vx>0 Then biliard\vx=biliard\vx-friction Else biliard\vx=biliard\vx+friction
If Abs(biliard\vx)<=friction Then biliard\vx=0

If biliard\vz>0 Then biliard\vz=biliard\vz-friction Else biliard\vz=biliard\vz+friction
If Abs(biliard\vz)<=friction Then biliard\vz=0

;выполнение столкновений со столом.
If biliard\y<=0 Then biliard\vy=-0.5*biliard\vy : biliard\y=-biliard\y
;выполнение столкновений со стенками север-юг
If Abs(biliard\z)>=39 Then
biliard\vz=-0.97*biliard\vz
If biliard\z>0 Then
biliard\z=39-(biliard\z-39)
Else
biliard\z=-39-(biliard\z+39)
EndIf
EndIf
;выполнение столкновений со стенками восток запад
If Abs(biliard\x)>=24 Then
biliard\vx=-0.97*biliard\vx
If biliard\x>0 Then
biliard\x=24-(biliard\x-24)
Else
biliard\x=-24-(biliard\x+24)
EndIf
EndIf

Next



For biliard.ball_data =Each ball_data
xPositionEntity biliard\id,biliard\x,biliard\y,biliard\z,1
Next

xRenderWorld()
xText 100,120,xMillisecs()-timeruno
xText 100,100,xMillisecs()
xText 100,110,MilliSecs()
Control(0.1,1)
xFlip()
Wend

End

Function Create_Balls(number)
For i=0 To number
biliard.ball_data = New ball_data
bb=xCreateSphere()
biliard\id=bb
biliard\x=-18.0+i*2
biliard\y=40
biliard\z=-20+i*2
biliard\vz=.1
biliard\vx=-.1
xPositionEntity biliard\id,biliard\x,biliard\y,biliard\z
xEntityColor biliard\id,Rand(0,255),Rand(0,255),Rand(0,255)
xEntityPickMode biliard\id,2,1,0
Next
End Function

Function Create_Table()
;base
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,0,-2,0
xScaleEntity bb,25,1,40
xEntityColor bb,0,128,0
xEntityBox bb,0,0,0,50,1,80
;south
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,0,-1,-41
xScaleEntity bb,23,2,1
xEntityColor bb,128,64,0
;north
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,0,-1,41
xScaleEntity bb,23,2,1
xEntityColor bb,128,64,0
;west
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,-26,-1,0
xScaleEntity bb,1,2,38
xEntityColor bb,128,64,0
;east
bb=xCreateCube()
xEntityPickMode bb,2,1,0
xPositionEntity bb,26,-1,0
xScaleEntity bb,1,2,38
xEntityColor bb,128,64,0

End Function


Function control(speed#,mousesensitivity#)
If xKeyDown(key_1) Then xWireframe(True) Else xWireframe(False)
xText(10, 10, "FPS: " +xGetFPS())
xText(10,30,"Trisinview: "+xTrisRendered ())
mxs#=mxs#+(xMouseXSpeed()/5.0)
mys#=mys#+(xMouseYSpeed()/5.0)
xRotateEntity (camera,mousesensitivity#*mys#,-mousesensitivity#*mxs#,0)
xMoveMouse xGraphicsWidth()/2,xGraphicsHeight()/2
If xKeyDown(17) Or xKeyDown(200) xMoveEntity camera,0,0,speed#
If xKeyDown(31) Or xKeyDown(20 xMoveEntity camera,0,0,-speed#
If xKeyDown(30) Or xKeyDown(203) xMoveEntity camera,-speed#,0,0
If xKeyDown(32) Or xKeyDown(205) xMoveEntity camera,speed#,0,0
xPositionEntity pivot,xEntityX#(camera,1),xEntityY#(camera,1),xEnt ityZ#(camera,1)
xPositionEntity camera,0,0,0
End Function
(Offline)
 
Ответить с цитированием
Старый 07.08.2011, 14:04   #197
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Есть вектора 1 (x1,y1,z1) с длиной l1 и 2 (x2,y2,z2) с длиной l2. Длина проекции вектора 2 на 1 будет: (x1*x2+y1*y2+z1*z2)/l1. То есть если будет три вектора некомпланарных, то координаты любого вектора можно записать в длинах проекций на эти три вектора? И это типа новый базис вектора 2 будет? А там уже и до матриц перевода из одних координат в другие не далеко?
(Offline)
 
Ответить с цитированием
Старый 09.08.2011, 10:54   #198
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Господа кавалеристы, як в хорсе сделать чтобы данные коллизий были глобальными? Ато писать код в майнцукле не кошерно, както.

Вызывать в теле функции xcollisions и делать xUpdateworld?
(Offline)
 
Ответить с цитированием
Старый 09.08.2011, 14:45   #199
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Прямо триллер по мотивам простейшей физики бильярдных шаров
Function ImpulseTranslater()
xCollisions type_ball,type_ball,2,2
xUpdateWorld
;Now my prechios data created
For biliard.ball_data =Each ball_data
;Does my current ball is collided with any other?
ph=xCountCollisions (biliard\id)
If ph>0 Then
;если таки да, значит надо подкорректировать его скорость.

;Пусть оно вернет мне c каким же именно шариком столкнулся текущий шарик, а также пусть скажет его скорость.
id=xCollisionEntity (biliard\id,0)
ReturnBallData(id)
idvx#=VecX()
idvy#=VecY()
idvz#=VecZ()
vx#=biliard\vx
vy#=biliard\vy
vz#=biliard\vz
;теперь пусть оно мне напишет нормаль столкновения.
x1#=xCollisionNX(biliard\id,0)
y1#=xCollisionNY(biliard\id,0)
z1#=xCollisionNZ(biliard\id,0)
;А теперь пусть оно мне вернет длину проекций скоростей на нормаль
proj1#=ProjectionOnVec#(x1,y1,z1,vx,vy,vz)
proj2#=ProjectionOnVec#(x1,y1,z1,idvx,idvy,idvz)
;поблагодарим за исполнительность.
ThankYou()
;теперь компьютер правильно посчитает остатки проекции после передачи импульсов и вернет их сюда.
Brain_Fucker_0000001(proj1,proj2)
newproj1#=VecX()
newproj2#=VecY()
;далее нужно модифицировать вектора скорости.
;вычитаю из векторов скорости изначальную проекцию и плюсую после обработки столкновения.
EndIf
Next
End Function

Function Brain_Fucker_0000001(proj1#,proj2#)
;нормаль направлена по радиусу ентити, от центра
;если проекция 1 меньше нуля. скорость внутрь ентити. Ентитя пытается убежать от той с которой произошел контакт.
If proj1<0 Then
If proj2<0 Then
;ентитя2 догоняет убегающую ентитю 1
;а первая ентити посмотрела на свою скорость и сказала раз у меня скорость меньше, чем у ентити2, то значит хер ты меня догонишь по тому как по модулю она больше
If proj1<proj2 Then

EndIf
;и были скорости ентитей равны и ржала первая над второй.
If proj1=proj2 Then

EndIf

;и оказалась по модулю скорость ентити 2 больше чем у первой, и огребла первая импульс равный дельте скоростей. И стало у первой импульс как у второй, а у первой как у второй.
If proj1>proj2 Then

EndIf


EndIf

If proj2=0 Then
;ентитя 2 стояла ниче не делала, а тут вдруг откуда нивозьмись, раз и въехала в неё первая, причем двигаясь от неё. Мистика
;и нихрена не произошло никакой передачи импульса. Ведь первая ентити убежала от второй

End If

If proj2>0 Then
;ентитя2 тоже пытается убежать от точки контакта.
;получилось у ентитей убежать друг от друга и осталсись проекции скоростей без изменений
End If
EndIf

;ентитя стоит себе или катится, но к шару два сама не приближается.
If proj1=0 Then
If proj2<0 Then
; а вот хер тебе сказала ентитя два и догнала ентитю 1
; и выхватила ентитя 1 от ентити 2 полный импульс, и осталось у ентити 2 ноль импульса
EndIf

If proj2=0 Then
; и было енити второй глубоко похер на первую, ибо они не сближались, но какимто образом пересеклись.
; посмотрели они друг на друга да и прокатились мимо, либо замерли рядышком. а передачи импульса не произошло.
End If

If proj2>0 Then
; и решила ентитя убежать от затаившейся ентити 1, страшно же, вдруг она подкарауливает
; и получилось у ентити2 убежать от первой. Ведь на самом деле первой ентити было плевать на вторую, хоть та и каталась впритирку.
End If
EndIf

;ентити один нагло катится на ентитю 2
If proj1>0 Then
If proj2<0 Then
; а ентити2 тоже не лыком шита и катится к ентити 1
;и как ухерачились они в лоб лоб
If proj1>-proj2 Then
;и победила первая вторую, нахлобучив её импульсом равным дельте модулей, сама же ентитя остановилась обезимпульсев
EndIf

If proj1=-proj2 Then
;ентити бодались-бодались да невыбодались и остановились потратив свои импульсы спроецированные на нормаль столкновения
EndIf

If proj1>-proj2 Then
;и победила вторая первую, нахлобучив её импульсом равным дельте модулей, сама же ентитя остановилась обезимпульсев
EndIf

EndIf

If proj2=0 Then
; ентити2 стоит себе или катиться, но к ентити 1 сама не приближается, за чо и агребет
;и огребла импульс ентити2 от первойБ а первая потратила весь импульс
End If

If proj2>0 Then
;ентитя 2 хорошо подумав решила свалить от ентити один.
If proj1>proj2 Then
;но догнала ентитити 1 ентити два и поменялась с нею размером импульса.
EndIf

If proj1=proj2 Then
;а не смогла она догнать ентитю2. И ничего не произошло, они просто коснулись.
EndIf

If proj1<proj2 Then
;гналась ентити один за второй, да не догнала. И ничего не произошло они тоже просто коснулись.
EndIf
End If
EndIf
vecar(0,0)=newproj1
vecar(1,0)=newproj2

End Function
(Offline)
 
Ответить с цитированием
Старый 09.08.2011, 14:48   #200
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Имитация водной поверхности.

Не думаю что тут найдётся много кто это будет компилить или читать. Народ ленивый, им картинки подавай, зрелищь, а не нудного кода..
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Mr_F_ (09.08.2011), St_AnGer (09.08.2011)
Старый 09.08.2011, 14:54   #201
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Будет модель стола. Где кликом можно будет катать шарики. без счетчиков без нефига, но и от не фига не зависящая а код точно не скомпилится. его там нету это только зарисовка

По задумке одной функцей это иницилизируется, а второй упдатится если камера в зоне досягаемости. Интерактивная модель стола для бильярда.
(Offline)
 
Ответить с цитированием
Старый 09.08.2011, 23:52   #202
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.



Ящик грязи такая прелесть ^__^

(Offline)
 
Ответить с цитированием
Старый 10.08.2011, 02:17   #203
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.


Правда она супер?
(Offline)
 
Ответить с цитированием
Старый 10.08.2011, 02:22   #204
Android
Бывалый
 
Регистрация: 29.03.2007
Сообщений: 662
Написано 199 полезных сообщений
(для 448 пользователей)
Ответ: Имитация водной поверхности.

Сообщение от dsd Посмотреть сообщение
Правда она супер?
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Android за это полезное сообщение:
moka (11.08.2011), Mr_F_ (12.08.2011), tormoz (10.08.2011)
Старый 10.08.2011, 02:27   #205
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

И это не рожа с интернета :D это дружит с соседями :D
(Offline)
 
Ответить с цитированием
Старый 10.08.2011, 02:38   #206
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Имитация водной поверхности.

dsd, возможно ты не понимаешь, но это не твой бложек. Тема уже давно скатилась в оффтоп, но теперь подавно.
__________________

(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
Артем Валерьевич (10.08.2011), Android (10.08.2011), tormoz (10.08.2011)
Старый 10.08.2011, 02:48   #207
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

она стала офтопом когда мне начали говорить, что блитц не айс.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
Старый 12.08.2011, 01:17   #208
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Первая версия столкновений шариков с респонсем типа бильярд
Пробел - дать одному шарику случайный пендаль в плоскости стола.

Кому не тяжко, посмотрите и откаментируйте сиё.

Последний раз редактировалось dsd, 23.10.2011 в 22:19.
(Offline)
 
Ответить с цитированием
Старый 12.08.2011, 21:24   #209
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Имитация водной поверхности.

Внезапно у меня запустился хорс в кодеблокс и удивительная знакомость кода укрепила меня в мысли, что блитц мне не нужен:

#include "xors3d.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    xAppTitle( "Xors3D - Simple Texture" );
   xGraphics3D( 800,600,32,false,true );


    Handle pivot=xCreatePivot();
    Handle camera = xCreateCamera(pivot);
    Handle light=xCreateLight();
    xPositionEntity (light,200.0,200.0,200.0);
    Handle cube=xCreateCube();
    xPositionEntity (cube,0,0,20);


   while (xWinMessage("WM_CLOSE")==0 && xKeyHit(KEY_ESCAPE)==false)
   {
       xTurnEntity (cube,0.1,0.1,0.1);
       xRenderWorld();


      xFlip();
   }
   return 0;
}
Вот это у меня есть, какая из них лучше? Не сочтите за офтоп.



И да где подсветку функций хорса врубить? Т.к. в settings => editor => syntax highlighting я не догоню как.
не то что бы мне это так уж сильно требуется, но... хочется.
(Offline)
 
Ответить с цитированием
Старый 12.08.2011, 21:50   #210
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: Имитация водной поверхности.

Шильдт - неплох.
Подсвечивается именно синтаксис язык и его ключевые слова. Вряд ли можно подсвечивать функции отдельной библиотеки.
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (12.08.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com