forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Вид от третьего лица - изображение ТРЯСЁТСЯ... (http://forum.boolean.name/showthread.php?t=6322)

ELIAS 01.09.2008 21:57

Вид от третьего лица - изображение ТРЯСЁТСЯ...
 
Добрый день)
Делаю вид от третьего лица в своей игре. Я знаю лишь один алгоритм, как это можно сделать...Алгоритм который приедлагался создателями DARKBasic в их мануале... Теперь я хочу портировать свою игру с DBPro на блитз... Многих функций, которые необходимы мне для вида от третьего лица в блитце нет((( Тогда я написал их в код сам...ТОчнее две функции мне дал HolyDel, а одну я сам попытался написать... вообщем-то в ней вся и проблема!!!:(
Моя функция предназначена для поинтирования(направления) объекта на определённую точку 3д простанства! (НЕ ОБЪЕКТА НА ОБЪЕКТ)

Вот код
Код:

Graphics3D 1280,1024,32,1
SetBuffer BackBuffer()
SeedRnd (MilliSecs())

;make camera
Global cam=CreateCamera()
CameraRange cam,5,30000

;make light
lit=CreateLight()

;make player
player = CreateSphere()
ScaleEntity player, 40, 40, 40
PositionEntity player,-9000, 100, -9000
RotateEntity player, 0, -45, 0

;make 50 random cubes
For i = 1 To 50
        n = n + i
        n=CreateCube()
        ScaleEntity n, Rand(40,100) , Rand(40,100), Rand(40,100)
        PositionEntity n, Rand(1, 3002), 0,Rand(1,3002)
Next





;cube for my function
Global pointdot=CreateCube()






Repeat
       
        ;move sphere
        playermove#=0
        If KeyDown(200)=1
                playermove#=0.2
        EndIf
        If KeyDown(208)=1
                playermove#=-0.2
        EndIf
        MoveEntity player, 0, 0, playermove#
       
       
       
        ;position camera
        ay# = EntityYaw#(player)
        x#=MouseXSpeed()*0.25
        MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
        RotateEntity player, 0, ay# - x#, 0
        PositionEntity cam, NewXValue(EntityX(player),-aY#-180,200),EntityY(player)+80 + 40, NewZValue(EntityZ(player),-aY#-180,200)
       
       
       
        ;задаем переменную режима камеры
        If KeyHit(28)=1
                If cammode=0
                        cammode = 1
                Else
                        cammode=0
                EndIf
        EndIf
       
        ;Поинтируем камеру...
        If cammode = 0
                DotPoint cam, EntityX(player),  EntityY(player)+30,  EntityZ(player)
        Else
                RotateEntity cam, 0, ay# - x#, 0
        EndIf
       
       
       
       
        UpdateWorld
        RenderWorld
        Flip 0
Until KeyHit(1)



End






;Эти две функции нужны для вида от третьего лица..
Function NewXValue(old#,angle#,steps#)
        Return old#+Sin(angle#)*steps#
End Function

Function NewZValue(old#,angle#,steps#)
        Return old#+Cos(angle#)*steps#
End Function


; Вот она - ГЛЮЧНАЯ функция, которую я написал сам...Из за неё трясётся изображение((((
Function DotPoint(entity, x#, y#, z#)
        PositionEntity pointdot, x#, y#, z#
        PointEntity entity, pointdot
End Function

Проблема в том, что изза моей ф-ии "DotPoint" трясётся изображение...или камера... вообщем вы сами можете всё увидеть просто запустите код(кубики на заднем плане сильно дёргаются!)... если же исключить мою функцию(нажмите ентер), то изображение трястить перестанет... я не понимаю почему...(((
Код с комментариями! Помогите разобраться! Буду очень благодарен! :)
:SOS:

HolyDel 01.09.2008 22:01

Ответ: Вид от третьего лица - изображение ТРЯСЁТСЯ...
 
в моих ф-ях тоже ошибка. надо так:
Код:

Function NewXValue#(old#,angle#,steps#)
        Return old#+Sin(angle#)*steps#
End Function

Function NewZValue#(old#,angle#,steps#)
        Return old#+Cos(angle#)*steps#
End Function


H@NON 01.09.2008 22:09

Ответ: Вид от третьего лица - изображение ТРЯСЁТСЯ...
 
дело в том что функции NewXValue и NewZValue возвращают целочисленные значения, а тебе нужны дробные, для того чтобы функция возвращала нужный тебе тип данных нужно в строке
Function NewXValue()
добавить в конце названия знак, определяющий тип данных ( в блитце по умолчанию всегда стоит Int то есть целочисленный, # - дробный, $ - строковый )
Function NewXValue#()

Если хочешь получить угол наклона от объекта на объект то используй команды VectorYaw и VectorPitch, они возвращают угол из вектора. Вот функция:

Function PointEntToCoords(entity, x#, y#, z#)
local yaw#, pitch#
local dx#, dy#, dz#
dx = x - EntityX(entity,1)
dy = y - EntityY(entity,1)
dz = z - EntityZ(entity,1)
yaw = VectorYaw( dx, dy, dz )
pitch = VectorPitch( dx, dy, dz )
RotateEntity entity, pitch, yaw, 0
end Function

Edit: Холи тут как тут :)))

ELIAS 01.09.2008 22:17

Ответ: Вид от третьего лица - изображение ТРЯСЁТСЯ...
 
HolyDel, H@NON, огромное вам спасибо! Теперь всё окей!


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot