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

voron 21.12.2010 02:42

Помогите осуществить совпадение координат
 
Доброго времени суток. Делаю так, чтобы модель можно было подстраивать по фото. Выделяем точку мышкой и передвигаем, модель при этом деформируется. Проблема в том, что координаты не совпадают (см. рис. слева две зелёные точки стоят рядом, а на модели вершины 26 и 18 отнюдь не рядом. Заранее благодарен.



PHP код:

...
Global 
mesh=LoadAnimMesh("Губы.3DS")
mesh=FindChild(mesh,"Box003")
Global 
surface=GetSurface(mesh,1)
Global 
start_x
Global start_y
Global plane=CreatePlane()
Global 
chislo_vertex=9
Dim array_point
(chislo_vertex)
Dim array_vertex_mesh(chislo_vertex)
Create_Fas_Profil_Fon()
Create_Points()
Start_Modify_Mesh(mesh)
...
Repeat
...
If 
MouseDown(1Then
  pick
=CameraPick(cam,MouseX(),MouseY())
  For 
x=0 To chislo_vertex
    
If array_point(x)=pick Then
      point
=array_point(x)
      
nomer=x
      start_pos_x
#=EntityX(array_point(nomer))
      
start_pos_y#=EntityY(array_point(nomer))
      
start_pos_z#=EntityZ(array_point(nomer))
      
start_vertex_x#=VertexX(surface,array_vertex_mesh(nomer))
      
start_vertex_y#=VertexY(surface,array_vertex_mesh(nomer))
      
start_vertex_z#=VertexZ(surface,array_vertex_mesh(nomer))
    
EndIf
    
EntityPickMode array_point(x),0
  Next
EndIf
...
If (
MouseDown(1)) And (point>0Then

  PositionEntity point
,PickedX(),PickedY(),EntityZ(point)
 
  
distance_x#=(-EntityX(array_point(nomer))+start_pos_x#+start_vertex_z#)
  
distance_y#=(EntityY(array_point(nomer))-start_pos_y#+start_vertex_y#)
  
distance_z#=(EntityZ(array_point(nomer))-start_pos_z#+start_vertex_x#)

  
vertex_x#=VertexX(surface,array_vertex_mesh(nomer))
  
vertex_y#=VertexY(surface,array_vertex_mesh(nomer))
  
vertex_z#=VertexZ(surface,array_vertex_mesh(nomer))

  
Select nomer
 
Case 0,1
    VertexCoords surface
,array_vertex_mesh(nomer),vertex_x#,distance_y#,distance_x#
  
End Select
  
EndIf
...

Function 
Start_World();                            

RotateEntity plane,-90,0,0
EntityColor plane
,137,137,137
PositionEntity plane
,0,0,15
EntityAlpha plane
,0.1
EntityPickMode plane
,2

End 
Function

Function 
Start_Modify_Mesh(mesh);                

RotateEntity mesh,0,10,0
PositionEntity mesh
,10,0,25

End 
Function 

Function 
Create_Fas_Profil_Fon();  

x=2

cube_fas
=CreateCube()
PositionEntity cube_fas,-9,0,15
ScaleEntity cube_fas
,2.46*x,x,0.01
texture
=LoadTexture("Губы фас.jpg")
EntityTexture cube_fas,texture

cube_profil
=CreateCube()
PositionEntity cube_profil,-1,0,15
ScaleEntity cube_profil
,0.88*x,x,0.01
texture
=LoadTexture("Губы профиль.jpg")
EntityTexture cube_profil,texture

End 
Function
Function 
Create_Points();                      

For 
x=0 To chislo_vertex
  array_point
(x)=CreateSphere(16)
  
PositionEntity array_point(x),-1,0,15
  ScaleEntity array_point
(x),0.1,0.1,0.1
  EntityColor array_point
(x),0,255,0
  EntityPickMode array_point
(x),1
Next


PositionEntity array_point
(0),-12.961,0.684,EntityZ(array_point(0))  ; 
PositionEntity array_point(1),-12.168,1.039,EntityZ(array_point(0))  ; 1 точка
PositionEntity array_point
(2),-11.402,1.230,EntityZ(array_point(0))  ; 2 точка
PositionEntity array_point
(3),-10.500,1.313,EntityZ(array_point(0))  ; 3 точка (верхняя)
PositionEntity array_point(4), -9.461,0.930,EntityZ(array_point(0))  ; 4 точка 

array_vertex_mesh
(0)=18  
array_vertex_mesh
(1)=26  

End 
Function 


Жека 21.12.2010 06:26

Ответ: Помогите осуществить совпадение координат
 
Мне на ум приходит хранить точки сетки в своей структуре типа vector3d{x#,y#z#}. Изначально инициализировать их значениями точек из plane.
Потом рисовать второй plane с режимом wireframe, немного придвинутым к камере, чтоб видеть сетку. Модифицировать его вместе с тем что с текстурой.

А рисовать управляющие точки можно в 2д с помощью проекций (но возможно это не лучший метод, но мне он приглянулся вдруг).

Код:

CameraProject(camera,selectedX[k],selectedY[k],selectedZ[k])
Oval(ProjectedX(),ProjectedY(),5,5)

selectedX(Y,Z) - координаты вершин

Наверное, месиво из круглешков получится (эх).

Ну а если сферами, то вот тут заменить код можно, вот это:

Код:

For x=0 To chislo_vertex
  array_point(x)=CreateSphere(16)
  PositionEntity array_point(x),-1,0,15
  ScaleEntity array_point(x),0.1,0.1,0.1
  EntityColor array_point(x),0,255,0
  EntityPickMode array_point(x),1
Next

на это:

Код:

array_point(0) = CreateSphere(16)
PositionEntity array_point(0),-1,0,15
ScaleEntity array_point(0),0.1,0.1,0.1
EntityColor array_point(0),0,255,0
EntityPickMode array_point(0),1

For x=1 To chislo_vertex
  array_point(x) = CopyEntity(array_point(0))
Next

А выбор вершин можно делать так. На клик мышки (MouseHit) выбираешь свою сферу, за которую тянуть. И покуда не отпустишь мышь - двигаешь. У тебя щас на зажатие (MouseDown) выбор выделенного, но это же шляпа.


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

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