|
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, время: 15:04.
|