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

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

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

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

Ответ
 
Опции темы
Старый 21.12.2010, 02:42   #1
voron
Нуждающийся
 
Регистрация: 10.09.2006
Сообщений: 77
Написано 3 полезных сообщений
(для 3 пользователей)
Помогите осуществить совпадение координат

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



...
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 
(Offline)
 
Ответить с цитированием
Старый 21.12.2010, 06:26   #2
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Помогите осуществить совпадение координат

Мне на ум приходит хранить точки сетки в своей структуре типа 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) выбор выделенного, но это же шляпа.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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