|
3D-программирование Вопросы, касающиеся программирования 3D мира |
19.12.2010, 04:50
|
#1
|
Нуждающийся
Регистрация: 10.09.2006
Сообщений: 77
Написано 3 полезных сообщений (для 3 пользователей)
|
Строго под курсором )))
Доброго времени суток. Помогите найти ошибку. На зелёной сфере нажимаем левую кнопку мыши и тянем. Сфера должна распологаться строго под курсором, но это не всегда. Заранее благодарен.
;**********************************************************************************
;************ 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
|
(Offline)
|
|
19.12.2010, 09:41
|
#2
|
Мастер
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений (для 2,526 пользователей)
|
Ответ: Строго под курсором )))
у тебя при нажатии ,энтити пик по сфере пикается поэтому и неправильно перемещается, чтобы этого не было надо отключать при нажатии пик сферы( хотя поидее тогда нужно все сферы отключать,чтоб не мешали)
pick=CameraPick(cam,MouseX(),MouseY()): ; Выбор объекта If MouseHit(1) Then For x=0 To chislo_vertex If array_vertex(x)=pick Then vertex=array_vertex(x) EntityPickMode vertex,0 EndIf Next EndIf ; Передвижение вершин If (MouseDown(1)) And (vertex>0) Move_Vertex(vertex) Else If vertex>0 EntityPickMode vertex,1:vertex=0 EndIf
а вообще я бы по другому методу сделал проверку точки под курсором. написал бы функцию проверки пересечения точки и квадрата и пикал только по плейну, и ниче бы не мешало
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.12.2010, 23:57
|
#3
|
Нуждающийся
Регистрация: 10.09.2006
Сообщений: 77
Написано 3 полезных сообщений (для 3 пользователей)
|
Re: Строго под курсором )))
Спасиб ))
|
(Offline)
|
|
16.02.2011, 23:11
|
#4
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Строго под курсором )))
Graphics3D ScreenW,ScreenH,Bits,FullScreen
ScreenW2=ScreenW/2 ; полуширина
ScreenH2=ScreenH/2; полувысота
Global ViewScale ; высота камеры (вид сверху)
ViewScale=15
Global GunTarget,GunTargetFix# ; GunTarget - это модель прицела, GunTargetFix# - моя вычислительная смещения 2д к 3д
GunTarget=CreateCube()
EntityColor GunTarget,50,20,20
EntityBlend GunTarget,3
ScaleEntity GunTarget,.1,.1,.1
GunTargetSetFix() ; вызов функции вычисления смещения 2д к 3д
PositionEntity GunTarget,PlayerX#+(MouseX()-ScreenW2)*GunTargetFix#,0.5,PlayerY#+(ScreenH2-MouseY())*GunTargetFix# ; перемещение прицела под курсор(как именно чёто переварить уже не могу, не охота, главное действует)
PointEntity Player,GunTarget ; игрок смотрит на прицел
Function GunTargetSetFix()
GunTargetFix#=19.072*ScreenW+(0.0031*ViewScale)
; 19.072 - погрешность относительно ширины экрана
; 0.0031 - погрешность высоты взгляда камеры
End Function
как это сделал понять и разбирать уже не хочется - главное срабатывает...
зы: код сокращён с моего исходника, может тут строчку пропустил для точности прицеливания...
камеру расположить как в TDS, предложить пример не могу, т.к. камера мульти-Case-режимная
а вот..
Global Camera=CreateCamera() ;создание камеры
PositionEntity Camera,MapX#,ViewScale,MapY#
RotateEntity Camera,90,0,0
PlayerX#=EntityX#(Player)
PlayerY#=EntityZ#(Player)
PositionEntity Camera,PlayerX#,ViewScale,PlayerY#
курсора в скриншоте виндус не сделал
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:43.
|