Доброго времени суток. Помогите найти ошибку. На зелёной сфере нажимаем левую кнопку мыши и тянем. Сфера должна распологаться строго под курсором, но это не всегда. Заранее благодарен.
;**********************************************************************************
;************ VULTUS. ОТРАБОТКА ТЕХНОЛОГИИ 7 СЕМЕСТР ***********
;***************** Основной файл *****************
;**********************************************************************************
;**** 17 декабря 2010 - 18 декабря 2010
;-------------------- Графический режим (настройки окна) ------------------------
Graphics3D 1024,600,32,2
SetBuffer BackBuffer()
;========== КОНСТАНТЫ, ПЕРЕМЕННЫЕ, ПОДКЛЮЧЕНИЕ МОДУЛЕЙ И БИБЛИОТЕК ==============
;--------------------------- Используемые модули --------------------------------
;-------------------------------- Константы -------------------------------------
Const cam_range#=3000 ; Дальность камеры
;---------------------------------- Типы ----------------------------------------
;--------------------------- Глобальные переменные ------------------------------
Global mesh=LoadMesh("Губы.3DS")
Global start_x
Global start_y
Global plane=CreatePlane()
Global chislo_vertex=9
Dim array_vertex(chislo_vertex)
;================================= ПРОГРАММА ====================================
piv=CreatePivot() ; Создание пивота для камеры
cam=Create_Camera(cam,piv,cam_range#) ; Создание камеры и задание её параметров
Create_Fas_Profil_Fon() ; Кубы с изображениями фаса и профиля
Create_Vertex() ; Создание вершин для корректировки меша
; Шрифт
font=LoadFont("Arial",24)
SetFont font
;############################## ОСНОВНОЙ ЦИКЛ #################################
Repeat
;---------------------------------- Функции --------------------------------------
; Управление камерой
Control_Camera(cam,piv)
; Стартовые преобразования меша
Start_Modify_Mesh(mesh)
; Начальные установки сцены
Start_World()
;---------------------------------- Программа -------------------------------------
; Вращение меша мышкой (зажимаем правую кнопку и вращаем)
If MouseDown(2) Then
If control_rotate=False Then
start_x=MouseX()
start_y=MouseY()
EndIf
control_rotate=True
Rotate_Mesh(mesh)
Else
control_rotate=False
EndIf
; Выбор объекта
If MouseDown(1) Then
pick=CameraPick(cam,MouseX(),MouseY())
For x=0 To chislo_vertex
If array_vertex(x)=pick Then
vertex=array_vertex(x)
EndIf
Next
EndIf
; Передвижение вершин
If (MouseDown(1)) And (vertex>0) Move_Vertex(vertex)
;---------------------------------- Функции --------------------------------------
;----------------------------------------------------------------------------------
UpdateWorld
RenderWorld
If vertex>0 Text 10,10,EntityX(vertex)
If vertex>0 Text 10,30,EntityY(vertex)
Flip
Until KeyHit(1)
;############################ КОНЕЦ ОСНОВНОГО ЦИКЛА ############################
End
;---------------------------------------------------------------------------------
;================================= ПОДПРОГРАММЫ ================================
;--------------------------- Функции создания "Вселенной" ------------------------
; Создание камеры и установки видимости
Function Create_Camera(camera,pivot,cam_range#)
; Создание камеры, установка расстояния зрения камеры
camera=CreateCamera(pivot)
CameraRange camera,1,cam_range#
; Туман
CameraFogMode camera,1
CameraFogRange camera,cam_range#-500,cam_range#
CameraFogColor camera,137,137,137
; Задание начальной позиции камеры
PositionEntity pivot,0,0,0
;RotateEntity camera,30,0,0
; Цвет сцены
CameraClsColor camera,137,137,137
Return camera
End Function
Function Start_World(); - Начальные установки сцены
; Свет
light=CreateLight()
PositionEntity light,30,0,-2000
AmbientLight 137,137,137
; Плоскость
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 Control_Camera(camera,pivot); - Управление камерой
If (Not KeyDown(29)) And (KeyDown(205)) MoveEntity pivot ,1,0,0
If (Not KeyDown(29)) And (KeyDown(203)) MoveEntity pivot ,-1,0,0
If (Not KeyDown(29)) And (Not KeyDown (56)) And (KeyDown(200)) MoveEntity pivot ,0,0,1
If (Not KeyDown(29)) And (Not KeyDown (56)) And (KeyDown(208)) MoveEntity pivot ,0,0,-1
If KeyDown (56) And KeyDown (200) TurnEntity camera, -0.5,0,0
If KeyDown (56) And KeyDown (208) TurnEntity camera, 0.5,0,0
If KeyDown (29) And KeyDown (200) MoveEntity pivot, 0,1,0
If KeyDown (29) And KeyDown (208) MoveEntity pivot, 0,-1,0
If KeyDown (29) And KeyDown (203) TurnEntity pivot, 0,2,0
If KeyDown (29) And KeyDown (205) TurnEntity pivot, 0,-2,0
End Function
;---------------------------------- Прочие функции -------------------------------
Function Start_Modify_Mesh(mesh); - Стартовые преобразования меша
RotateEntity mesh,0,10,0
PositionEntity mesh,8,0,15
End Function
Function Rotate_Mesh(mesh); - Вращение меша мышкой
distance_x=MouseX()-start_x
distance_y=start_y-MouseY()
TurnEntity mesh,distance_y,distance_x,0
End Function
Function Create_Fas_Profil_Fon(); - Кубы с изображениями фаса и профиля
x=2.5
; Фас
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_Vertex(); - Создание вершин для корректировки меша
; Создание вершин
For x=0 To chislo_vertex
array_vertex(x)=CreateSphere(16)
PositionEntity array_vertex(x),-1,0,15
ScaleEntity array_vertex(x),0.1,0.1,0.1
EntityColor array_vertex(x),0,255,0
EntityPickMode array_vertex(x),1
Next
; Начальные позиции
PositionEntity array_vertex(0),-12.961,0.684,EntityZ(array_vertex(0)) ; Крайняя левая точка (0 точка)
; Верх
PositionEntity array_vertex(1),-12.168,1.039,EntityZ(array_vertex(0)) ; 1 точка
PositionEntity array_vertex(2),-11.402,1.230,EntityZ(array_vertex(0)) ; 2 точка
PositionEntity array_vertex(3),-10.500,1.313,EntityZ(array_vertex(0)) ; 3 точка (верхняя)
PositionEntity array_vertex(4), -9.461,0.930,EntityZ(array_vertex(0)) ; 4 точка (впадина)
End Function
Function Move_Vertex(vertex); - Передвижение вершин
PositionEntity vertex,PickedX(),PickedY(),EntityZ(vertex)
End Function