 |
3D-программирование Вопросы, касающиеся программирования 3D мира |
06.08.2011, 21:40
|
#196
|
Мастер
Регистрация: 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
|
Мастер
Регистрация: 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
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Господа кавалеристы, як в хорсе сделать чтобы данные коллизий были глобальными? Ато писать код в майнцукле не кошерно, както.
Вызывать в теле функции xcollisions и делать xUpdateworld?
|
(Offline)
|
|
09.08.2011, 14:45
|
#199
|
Мастер
Регистрация: 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
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Имитация водной поверхности.
Не думаю что тут найдётся много кто это будет компилить или читать. Народ ленивый, им картинки подавай, зрелищь, а не нудного кода..
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
09.08.2011, 14:54
|
#201
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Будет модель стола. Где кликом можно будет катать шарики. без счетчиков без нефига, но и от не фига не зависящая  а код точно не скомпилится. его там нету это только зарисовка
По задумке одной функцей это иницилизируется, а второй упдатится если камера в зоне досягаемости. Интерактивная модель стола для бильярда.
|
(Offline)
|
|
09.08.2011, 23:52
|
#202
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Ящик грязи такая прелесть ^__^

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

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

|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Android за это полезное сообщение:
|
|
10.08.2011, 02:27
|
#205
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
И это не рожа с интернета :D это дружит с соседями :D
|
(Offline)
|
|
10.08.2011, 02:38
|
#206
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Имитация водной поверхности.
dsd, возможно ты не понимаешь, но это не твой бложек. Тема уже давно скатилась в оффтоп, но теперь подавно.
__________________
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
|
10.08.2011, 02:48
|
#207
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
она стала офтопом когда мне начали говорить, что блитц не айс.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
|
|
12.08.2011, 01:17
|
#208
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Имитация водной поверхности.
Первая версия столкновений шариков с респонсем типа бильярд 
Пробел - дать одному шарику случайный пендаль в плоскости стола.
Кому не тяжко, посмотрите и откаментируйте сиё.
Последний раз редактировалось dsd, 23.10.2011 в 22:19.
|
(Offline)
|
|
12.08.2011, 21:24
|
#209
|
Мастер
Регистрация: 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
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Имитация водной поверхности.
Шильдт - неплох.
Подсвечивается именно синтаксис язык и его ключевые слова. Вряд ли можно подсвечивать функции отдельной библиотеки.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:41.
|