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

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

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

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

Ответ
 
Опции темы
Старый 19.12.2010, 04:50   #1
voron
Нуждающийся
 
Регистрация: 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
pepel
Мастер
 
Аватар для pepel
 
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений
(для 2,526 пользователей)
Ответ: Строго под курсором )))

у тебя при нажатии ,энтити пик по сфере пикается поэтому и неправильно перемещается, чтобы этого не было надо отключать при нажатии пик сферы( хотя поидее тогда нужно все сферы отключать,чтоб не мешали)

pick=CameraPick(cam,MouseX(),MouseY()): 
Выбор объекта
If MouseHit(1Then

  
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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
voron (19.12.2010)
Старый 19.12.2010, 23:57   #3
voron
Нуждающийся
 
Регистрация: 10.09.2006
Сообщений: 77
Написано 3 полезных сообщений
(для 3 пользователей)
Re: Строго под курсором )))

Спасиб ))
(Offline)
 
Ответить с цитированием
Старый 16.02.2011, 23:11   #4
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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