 |
3D-программирование Вопросы, касающиеся программирования 3D мира |
21.12.2010, 02:42
|
#1
|
Нуждающийся
Регистрация: 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(1) Then
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>0) Then
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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:14.
|