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=15000)

dsd 05.08.2011 21:50

Ответ: Имитация водной поверхности.
 
Это?
Цитата:

BBDECL void BBCALL xSetSurfaceFrustumSphere ( Surface * surface,
float x,
float y,
float z,
float radii
)

Sets surface's bounding sphere for frustum culling.

Parameters:
surface Surface handle
x x coordinate of bounding sphere center
y y coordinate of bounding sphere center
z z coordinate of bounding sphere center
radii Radius of bounding sphere

Цитата:

BBDECL void BBCALL xCalculateFrustumVolume ( Entity * entity )

Calculates a volume used for frustum culling.

Both frustum box and frustum sphere are calculated. This function is useful if have modified position of the vertices manually.

Parameters:
entity Entity handle

Я так понимаю, что первая ф-ция гораздо выгодней по скорости.

Шо це?
BBDECL void BBCALL xVertexTangent ( Surface * surface,
int vertex,
float x,
float y,
float z
)

Sets the tangent of an existing vertex.

Parameters:
surface Surface handle
vertex Vertex index
x Tangent x of vertex
y Tangent y of vertex
z Tangent z of vertex

BBDECL void BBCALL xVertexBinormal ( Surface * surface,
int vertex,
float x,
float y,
float z
)

Sets the binormal of an existing vertex.

Parameters:
surface Surface handle
vertex Vertex index
x Binormal x of vertex
y Binormal y of vertex
z Binormal z of vertex

.Squid 05.08.2011 21:53

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

xCreateSurface (Entity *entity, Brush *brush=NULL, bool dynamic=false)
Попробуй.

dsd 05.08.2011 22:03

Ответ: Имитация водной поверхности.
 
Лениво было выводить формулы соответствия ячеек массива и индексов вершин.

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

dsd 06.08.2011 21:40

Ответ: Имитация водной поверхности.
 
Прикольный глюк :)

...
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(208) 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

dsd 07.08.2011 14:04

Ответ: Имитация водной поверхности.
 
Есть вектора 1 (x1,y1,z1) с длиной l1 и 2 (x2,y2,z2) с длиной l2. Длина проекции вектора 2 на 1 будет: (x1*x2+y1*y2+z1*z2)/l1. То есть если будет три вектора некомпланарных, то координаты любого вектора можно записать в длинах проекций на эти три вектора? И это типа новый базис вектора 2 будет? А там уже и до матриц перевода из одних координат в другие не далеко?

dsd 09.08.2011 10:54

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

Вызывать в теле функции xcollisions и делать xUpdateworld?

dsd 09.08.2011 14:45

Ответ: Имитация водной поверхности.
 
Прямо триллер по мотивам простейшей физики бильярдных шаров :)
Цитата:

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

moka 09.08.2011 14:48

Ответ: Имитация водной поверхности.
 
Не думаю что тут найдётся много кто это будет компилить или читать. Народ ленивый, им картинки подавай, зрелищь, а не нудного кода..

dsd 09.08.2011 14:54

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

По задумке одной функцей это иницилизируется, а второй упдатится если камера в зоне досягаемости. Интерактивная модель стола для бильярда.

dsd 09.08.2011 23:52

Ответ: Имитация водной поверхности.
 


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


dsd 10.08.2011 02:17

Ответ: Имитация водной поверхности.
 

Правда она супер?

Android 10.08.2011 02:22

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от dsd (Сообщение 198599)
Правда она супер?


dsd 10.08.2011 02:27

Ответ: Имитация водной поверхности.
 
И это не рожа с интернета :D это дружит с соседями :D

.Squid 10.08.2011 02:38

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

dsd 10.08.2011 02:48

Ответ: Имитация водной поверхности.
 
она стала офтопом когда мне начали говорить, что блитц не айс.

dsd 12.08.2011 01:17

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

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

dsd 12.08.2011 21:24

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

Код:

#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 я не догоню как.
не то что бы мне это так уж сильно требуется, но... хочется.

.Squid 12.08.2011 21:50

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

dsd 12.08.2011 22:39

Ответ: Имитация водной поверхности.
 
Шейдер теней.
1. Делаем рендер с камеры стоящей в позиции света и ориентированной по направлению света. Результатом должна стать текстура, в которой цветом будет записано расстояние от видимых пикселей до источника света. Допустим красный+зеленый кодируют целую часть, а голубой дробную.
2. Далее рендрим сцену с обычной позиции камеры. Вершинный шейдер передает в пиксельный позиции и текстурные координаты вершин. Все тени в пиксельном шейдере. Передаем в шейдер позицию источника света и текстуру из п.1. Далее используя матрицу проекции для той камеры, что стоит в позиции источника света узнаю, верхний ли этот пиксель или нет, если нет, значит он в тени, значит надо совершить затенение, что само по себе тривиальная задача. И тут появляется возможность супер-дюпер манипулирования параметрами тени, хошь тени как на луне, хошь святящиеся. В итоге должно получиться само затенение.
Все это можно объединить в одном шейдере с двумя проходами. Первый проход создание текстуры глубины сцены с позиции света. Камеру создавать не нужно, а на основании позиции света можно замутить матрицу проекции для камеры как бы существующей в этом месте.
Для отсутствия швов карту глубины можно сделать кубомапой.

Хотя бы в общих чертах я прав?

Mr_F_ 12.08.2011 23:27

Ответ: Имитация водной поверхности.
 
Цитата:

Допустим красный+зеленый кодируют целую часть, а голубой дробную.
можно просто использовать флоатовую одноканальную текстуру (R32F).
Цитата:

текстурные координаты вершин
они тут причём?
в VS считаешь просто помимо обычной позиции, позицию, полученную переменожением на шадоумап-матрицу. шадоумап-матрица = world * lightView * lightProj. потом эту матрицу, либо результат перемножения надо перевести в 0-1 диапазон, чтобы использовать как текстурные координаты для карты глубины. удобнее изначально шадоумап-матрицу умножить на скейлящую в нужный диапазон матрицу.
Цитата:

Для отсутствия швов карту глубины можно сделать кубомапой.
??? для точечных лайтов так делают, для направленного источника не нужно.
Цитата:

Камеру создавать не нужно
ну камера в ксорсе тебе бесплатно может предоставить view и proj матрицы не нагружая рендер. так что нет смысла самому конструировать.

dsd 12.08.2011 23:53

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

dsd 13.08.2011 14:39

Ответ: Имитация водной поверхности.
 
char fps;
xText (10,20,fps=xGetFPS());

выдает:
\init.cpp|23|error: initializing argument 3 of 'void xText(int, int, const char*, int, int)'|
Это типа я этой командой могу только константы печатать? O_o

Nex 13.08.2011 14:50

Ответ: Имитация водной поверхности.
 
так?
Цитата:

xText (10,20,"fps"+xGetFPS());

dsd 13.08.2011 14:54

Ответ: Имитация водной поверхности.
 
так запускает, секунду печатает fps, потом ничего не печатает :)

Mr_F_ 13.08.2011 14:56

Ответ: Имитация водной поверхности.
 
char содержит 1 символ (1 байт). для строк используй std::string.

#include <string>
using namespace std;
...
чтобы конвертировать число в стринг, придётся написать отдельную функцию:
string itoa( int n )
{
char buff[32];
sprintf(buff,"%d",n);
return string( buff );
}
...
xText (10,20, (string("fps: ") + itoa(xGetFPS())).c_str() );

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

---
исправил ошибочку

dsd 13.08.2011 14:59

Ответ: Имитация водной поверхности.
 
Так и читаю.

Щас вроде в башке устаканивается отличие и структура условий, циклов. Вроде ниче такой язык программирования :)

HolyDel 13.08.2011 16:55

Ответ: Имитация водной поверхности.
 
Цитата:

Вроде ниче такой язык программирования
да. мировое сообщество программистов с тобой солидарно

dsd 13.08.2011 18:47

Ответ: Имитация водной поверхности.
 
Небольшой код для C++ и Xors3D, с вращающимся тором и перемещением камеры. Для Code::Blocks 10.05

Код:

#include <iostream>
#include "xors3d.h"
//#include <string>
#include <cmath>


using namespace std;


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  xAppTitle( "Basic start" );
  xGraphics3D( 640,480,false,false,true );

  void Control(double speed, double mousesensitivity, Handle Camera, Handle Pivot);
    Handle Cube = xCreateTorus(16,4,1);
    Handle Pivot = xCreatePivot();
    Handle Camera = xCreateCamera(Pivot);
    Handle Light = xCreateLight(LIGHT_DIRECTIONAL);


        xTurnEntity(Light, 30.0, 30.0, 0.0);
        xMoveEntity(Cube, 0.0, 0.0, 10.0);

  while (xWinMessage("WM_CLOSE")==0 && xKeyHit(KEY_ESCAPE)==false)
  {
        xTurnEntity(Cube, 1.0, 1.0, 1.0);
        xMoveEntity(Cube,0,0.2*sin(xMillisecs()/1000),0);
      xRenderWorld();
        Control(1,1,Camera,Pivot);
      xFlip();
  }
  return 0;
}



void Control(double speed, double mousesensitivity, Handle Camera, Handle Pivot) {
    double mxs;
    double mys;
      if (xKeyDown(2)) xWireframe(true);
      if (not xKeyDown(2)) xWireframe(false);
      xText (10,10,"i'm still not able to use properly this function, so it's reason why this have an console output :)");
      if (xKeyHit(57))  {cout<<"FPS is "<<xGetFPS(); cout<<", time is "<<xMillisecs()<<"\n";  };
        mxs+=xMouseXSpeed()/5.0;
        mys+=xMouseYSpeed()/5.0;
        if (xKeyHit(3)) {cout<<mxs<<"  "<<mys<<"\n";};
        xTurnEntity (Camera,mousesensitivity*mys,-mousesensitivity*mxs,0);
        xMoveMouse (xGraphicsWidth()/2,xGraphicsHeight()/2);
        if (xKeyDown(17) || xKeyDown(200)) xMoveEntity (Camera,0,0,speed);
        if (xKeyDown(31) || xKeyDown(208)) xMoveEntity (Camera,0,0,-speed);
        if (xKeyDown(30) || xKeyDown(203)) xMoveEntity (Camera,-speed,0,0);
        if (xKeyDown(32) || xKeyDown(205)) xMoveEntity (Camera,speed,0,0);
        xPositionEntity (Pivot,xEntityX(Camera,1),xEntityY(Camera,1),xEntityZ(Camera,1));
        xPositionEntity (Camera,0,0,0);
}

Ибо в гугле на русском языке этого нет, но пусть будет.

NitE 13.08.2011 18:54

Ответ: Имитация водной поверхности.
 
dsd, не думал блог завести ?

dsd 13.08.2011 19:00

Ответ: Имитация водной поверхности.
 
С названием: Быдлокод для хорса?

NitE 13.08.2011 19:02

Ответ: Имитация водной поверхности.
 
С любым названием.

dsd 13.08.2011 19:05

Ответ: Имитация водной поверхности.
 
Зачем? Кто его будет читать? и указывать на самые тупые места моего кода?

NitE 13.08.2011 19:20

Ответ: Имитация водной поверхности.
 
Теже люди которые читают то что ты здесь выкладываешь, наверное.

dsd 13.08.2011 19:26

Ответ: Имитация водной поверхности.
 
Ты имел в виду какой-то определенный блог?

NitE 13.08.2011 19:51

Ответ: Имитация водной поверхности.
 
Любой, на котором ты сможешь выкладывать свой код и скриншоты.

dsd 13.08.2011 19:58

Ответ: Имитация водной поверхности.
 
После бана и исчерпания фантазии для генерации ников.

NitE 13.08.2011 21:26

Ответ: Имитация водной поверхности.
 
Щито?

LLI.T.A.L.K.E.R. 13.08.2011 23:08

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от NitE (Сообщение 198933)
Щито?

Пока администрация не запретит.

NitE 13.08.2011 23:18

Ответ: Имитация водной поверхности.
 
Цитата:

Blitz3D > Имитация водной поверхности.
Цитата:

Небольшой код для C++ и Xors3D, с вращающимся тором и перемещением камеры.
.... фигня какаято получается, вам не кажется ?

Nerd 14.08.2011 01:06

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от NitE (Сообщение 198939)
.... фигня какаято получается, вам не кажется ?

Да какая разница, структурофаг? Не создавать же >9k тредов в разных разделах.

NitE 14.08.2011 01:26

Ответ: Имитация водной поверхности.
 
Цитата:

Не создавать же >9k тредов в разных разделах.
Цитата:

dsd, не думал блог завести ?
.... фигня какаято получается, вам не кажется ?

.Squid 14.08.2011 15:09

Ответ: Имитация водной поверхности.
 
Цитата:

Сообщение от Mr_F_ (Сообщение 198886)
string itoa( int n )
{
char buff[32];
sprintf(buff,"%d",n);
return string( buff );
}
...
xText (10,20, (string("fps: ") + itoa(xGetFPS())).c_str() );

Нахрена этот бред, пардон?
Код:

char console[256];
sprintf_s(console, 256, "fps: %d", xGetFPS());
xText (10, 20, console);


Mr_F_ 14.08.2011 15:26

Ответ: Имитация водной поверхности.
 
Цитата:

Нахрена этот бред, пардон?
хз. когда начинал изучать с++, гуглил конверт из числа в стринг -> нашёл ту функцию.
ну и потом синтаксис sprintf мне кажется бредовым и неинтуитивным.
%d? wtf?
да и часто ты юзаешь массивы чаров повсюду? удобнее когда всё что связано со стрингами обёрнуто в 1 класс.

так можно привести пример в стиле:
a = b+c; - нахрен этот бред, пардон?
<приводишь асм код сложения>

.Squid 14.08.2011 15:50

Ответ: Имитация водной поверхности.
 
Т.е. ты считаешь это (string("fps: ") + itoa(xGetFPS())).c_str() нормальным кодом?

Mr_F_ 14.08.2011 16:36

Ответ: Имитация водной поверхности.
 
я считаю его более понятным

.Squid 14.08.2011 17:13

Ответ: Имитация водной поверхности.
 
Оукей

dsd 14.08.2011 18:11

Ответ: Имитация водной поверхности.
 
Вопрос по глобальности переменных в С++:

Грубо говоря обычная переменная это тоже, что и переменная в блитцобэйсике. А указатель указывающий на эту переменную есть аналог объявления переменной глобальной. То есть :

int q=10 // q=10
int *d=q // global q=10

соответственно q будет иметь значение 10, только в теле той функции, где она объявленна, а *d в силу того, что это адрес ячейки памяти будет 10 во всей программе, во всяком случае до тех пор пока значение там не изменится. Так?

Также не надо боятся передовать даже большие массивы в заголовке функций ибо кроме адреса первой по счету ячейки больше ничего не передается?

Как меня годами пугали надписи такого типа в самом начале книжек для чайников:
if (a==0 || a++<=3) {cout<<a<<" 1"<<a<<"olala\n"};

If a=0 or (a+1)<=3 then Print a+" 1"+a+"olala"

.Squid 14.08.2011 18:23

Ответ: Имитация водной поверхности.
 
Нет, неверно.
При выходе из области видимости, переменная q умрет. Конечно, не факт, что содержимое этой ячейки памяти сразу поменяется, но и рассчитывать на то, что оно сохранится, не стоит.
http://programmersclub.ru/12/

dsd 14.08.2011 18:49

Ответ: Имитация водной поверхности.
 
Класс, написанно явно для дебилов! То что надо:super:

dsd 14.08.2011 23:24

Ответ: Имитация водной поверхности.
 


Супер функция, попозже сделаю поверхность на вид сплошной и на все вертексы.

Код:

Handle CreateSpring(double torrad, double inrad,int elements,int segments,int vitki,double shagvitka){


Handle mesh=xCreateMesh();
Handle meshsurf=xCreateSurface(mesh);
int i,h,x;
double x1,y1,z1;
//vertex creation
    for (i=0;i<=(vitki*elements);i++){
        for (h=0;h<=segments;h++){
            double deg1,deg2;
            //перевод в радианы
            /*
            1градус=3,1417/180
            */
            deg1=i*6.2834/elements;
            deg2=h*6.2834/segments;
            x1=torrad*sin(deg1)+inrad*cos(deg2)*sin(deg1);
            y1=torrad*cos(deg1)+inrad*cos(deg2)*cos(deg1);
            z1=inrad*sin(deg2)+shagvitka*i/elements;
                xAddVertex (meshsurf,x1,y1,z1,inrad*h/segments,inrad*i/elements);
            };
        };
int v0,v1,v2,v3;
int qvert = xCountVertices(meshsurf)-1;
  for (x=0;x<=(vitki*elements);x++){
        for (i=0;i<=segments;i++){
            v0=i+segments*x;
            v1=v0+1;
            v2=v0+segments;
            v3=v2+1;
            if (v3<=qvert) {
                xAddTriangle (meshsurf,v2,v0,v3);
                xAddTriangle (meshsurf,v0,v1,v3);
            };
        };
    };

xUpdateNormals (mesh);
return mesh;
};

P.s. Посоветуйте математическую либу. Щоб там оперции с векторами были, штоб много математики разной. И либу, которая синусы косинусы резко считает, пусть и с погрешностью.

предлагать решать sin(x)=x-x^3/3!+x^5/5!-x^7/7!... до полного самоудвлетворения не надо :)
http://alglib.sources.ru/?

Mr_F_ 15.08.2011 00:36

Ответ: Имитация водной поверхности.
 
Цитата:

P.s. Посоветуйте математическую либу. Щоб там оперции с векторами были, штоб много математики разной. И либу, которая синусы косинусы резко считает, пусть и с погрешностью.
минимум (типа синусов) есть, если заинклудишь <cmath>

dsd 15.08.2011 00:51

Ответ: Имитация водной поверхности.
 
Я это знаю. И наличие в теле функции нескольких синусов и косинусов, какбэ намекает на это :)

Mr_F_ 15.08.2011 01:00

Ответ: Имитация водной поверхности.
 
ну попробуй для остального тогда поюзать XNA математику.
поставляется вместе в directx sdk

HolyDel 15.08.2011 22:43

Ответ: Имитация водной поверхности.
 
Код:

void sincos(float a, float &s, float &c)
{
  _asm
  {
    fld a
    fsincos
    fstp dword ptr [c]
    fstp dword ptr [s]
  }
}

использовать так:
Код:

float sinx, cosx;
sincos(angle,sinx,cosx);

работает быстрее, чем если считать синус и косуинус по раздельности.

dsd 15.08.2011 22:58

Ответ: Имитация водной поверхности.
 
А как значение разделяются? В смысле присваиваются?
Осознал как :)

Кстати
Цитата:

IV. Current futeres:
Второе слово помоему пишется несколько иначе :) features вроде.

dsd 16.08.2011 13:50

Ответ: Имитация водной поверхности.
 
Оффтоп:

Вчера на опте прикол был :)

Стою в общем в очереди. Продавцы армяне женщина и мужик. Мужик такой: 1,80, 90 кг, вены даже на сиськах торчат. У них ажиотажный спрос, очередь. Тут приходит еще один мужик, протягивает продавцу пачку тысячных и намекает, что какбэ не плохо уже забрать товар. Армян тихо так отвечает , что щас сбегает на склад и заявка будет готова, ну и срывается в галоп, прихватив пачку бабок. Покупатель кричит че-то в след на родном языке, продавец чето орет в ответ и увеличивает скорость километров этак до 30 в час. И тут за армяном срываются два мимо проходивших 20 летних пионера : D. И попытались они восстановить справедливость :) И выхватили они не только от армяна, но еще и от охраны.

dsd 16.08.2011 20:25

Ответ: Имитация водной поверхности.
 
Цитата:

char console[256];
sprintf_s(console, 256, "fps: %d", xGetFPS());
xText (10, 20, console);
В виду того, что я делаю это в кодеблокс, а оно использует линуксячий компилятор.

То не смотря на эту строку в самом начале:#include <stdio.h>
Оно мне пишет:
"error: 'sprintf_s' was not declared in this scope|"

А при sprintf(console, 256, "fps: %d", xGetFPS());

error: invalid conversion from 'int' to 'const char*'
и
error: initializing argument 2 of 'int sprintf(char*, const char*, ...)'|

в виде
Цитата:

char console[256];
sprintf(console, "%d", xGetFPS());
xText (10, 30, console);
Работает, так можно или это плохо? а "%d" обозначает добавить к строке?


Мой перевод в аргб, тупо работает :)
Цитата:

int ARGB(int a,int r,int b, int g){
int colora=(a<<24)+(r<<16)+(b<<8)+g;
return colora;
};
xWritePixel (100,100,ARGB(255,255,0, 0));

moka 16.08.2011 22:50

Ответ: Имитация водной поверхности.
 
Изучи Bitwise Operators, для смещения по битам при сложении чисел, а то эти умножения на 16777216 или 65536, просто ужасны..

dsd 16.08.2011 23:16

Ответ: Имитация водной поверхности.
 
okey



Цитата:

BBDECL void BBCALL xCreateDSS ( int width,
int height
)

Creates a depth-stencil surface.

Depth-stencil surface is used for z-buffer technique. It's used to write the scene depth for clipping invisible pixels. By default DSS is used with backbuffer dimensions, but if you want to render to larger textures you must create DSS with an appropriate dimensions. E.g. if you use 800x600 mode, default DSS will be 800x600 too. If you want to render to 1024x1024 texture (e.g. for shadows), you must call xCreateDSS(1024, 1024) to make things work.

Parameters:
width Depth-stencil surface width
height Depth-stencil surface height
Захотелось мне нарисовать вершины на мешах, а те из них которые не видимы, что бы не рисовать. И захотелось мне читать для каждого пикселя его з-буффер. Как?


Какая интересная функция :)
Цитата:

BBDECL void BBCALL xSetRenderWindow ( HWND window )

Sets the window for rendering.

It may be used by map editor or other tools to render into some gadgets.

Parameters:
window Pointer to rendering window

HolyDel 16.08.2011 23:42

Ответ: Имитация водной поверхности.
 
по принтам:

http://ru.wikipedia.org/wiki/Printf

dsd 17.08.2011 17:41

Ответ: Имитация водной поверхности.
 
xProjectedZ() Нужно только для вывода значения от команды xCameraProject2D ()?

При xCameraProject() туда тоже пишется какоето значение чуть меньшее 1 если точка перед камерой. Что это за значение?
Средствами хорса я вообще могу получить данные из буфера глубины?

Mr_F_ 17.08.2011 17:48

Ответ: Имитация водной поверхности.
 
Цитата:

Средствами хорса я вообще могу получить данные из буфера глубины?
збуффер?
получить для обработки на ЦПУ? крайне не рекомендую это делать т.к. гонять збуфер из видеопамяти в оперативку будет офигительно снижать фпс.

dsd 17.08.2011 17:57

Ответ: Имитация водной поверхности.
 
Я просто хочу спроецировать позицию вертекса на экран и узнать видима ли эта вершина или нет. Если видима то в области рядом с полученными координатами нарисовать синий или красный квадратик и все :(.

Пока пришла идея сравнивать нормаль и вектор от точки до позиции камеры и рисовать если угол меньше равен 90. Но если в сюрфейсе есть изгиб то будут рисоваться и те вершины которые не видимы.

Mr_F_ 17.08.2011 17:59

Ответ: Имитация водной поверхности.
 
используй occlusion queries. вроде бы они уже есть в ксорсе... спроси Сквида.


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

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