29 октября 2010

OpenGL GLSL Debugger / Blender3D / Linux

Вопрос...
Что есть для работы с OpenGL GLSL под Linux...
Ответ... OpenGL GLSL Debugger.

***

- http://www.vis.uni-stuttgart.de/
- http://www.vis.uni-stuttgart.de/glsldevil/index.html#downloads

Что тянит...

Additional to GLSL version 1.2 the following extensions are supported:
ARB_texture_rectangle, ARB_draw_buffers, EXT_bindable_uniform,
EXT_geometry_shader4, EXT_gpu_shader4, EXT_texture_array. Further vendor
specific enhancements to the GLSL compiler (i.e. additional implicit
type casts, Cg compatibility, ...) are not supported in the current version.

28 октября 2010

Silver Web : Angedonia Beta 1 / Первые Наработки

Выполнен ряд первых базовых наработок по тактическому аддну Angedonia.

Мини экскурс что будет...

- Совмещение с базовой версией (карта).
- Поддержка GLSL (основная версия без GLSL).
- Три тактических уровня.

***

Первая тактика полёт у орбиты.
Уничтожение оборудования космо станций.

Заметки из описания...

***

Тактика боя с кораблями противника.

- Lunar A2 в отличии от базовой версии более манёвренный.
- Корабли противника уклоняются от выстрелов лазера игрока.
- На близком расстоянии уклонение невозможно.
- Оружие Lunar A2 наводится на ракеты игрока.
- Основная тактика в манипуляции тактическим расстоянием от врага до игрока.

***

Тактика уничтожения оборудования станций.

- Основная задача уничтожить оборудование станций.
- 2ва Глаза / 2ве ракетные установки / 2ва радара / Улей.
- При атаки частей станции идёт ответ станции огнём.
- Разные части дают разный отклик в атаке на игрока.
- При попадании в радар по игроку ведётся огонь со станции.
- При уничтожении части автоматически идёт новый запуск корабля врага.


***

Манёвры в тактической Зоне.

- В астероидном поле корабль игрока уязвим.
- В астероидном поле корабль противника уязвим.
- Урон от астероидов маленький.
- Всё вооружение взаимодействует с астероидным полем.
- Тактическая сетка присутствует.

21 октября 2010

Silver Web Beta 2.0 is out NOW! / Blender Game Engine



Видео Обзор...

http://www.youtube.com/watch?v=DXXdZuAbwYY

***


http://sourceforge.net/projects/silverweb/files/

Основной Список Изменений...

- LVL3 / Перемещение-наводка ракет ботов в 3D.
- Полная переработка Текстур.
- Новые Брифинги.
- Озвучка всех Брифингов (Жен.Голос спс LiSUS).
- Смена системы вооружения / щитов.
- Добавлена сетка Эклиптики.
- Добавлены / доработаны FX.
- Созданы 3D фоны космоса.
- Реализация станции портала / концовки уровня.
- Баланс скорости кораблей / смена гравитации (скрипт) / кнопка ускорения.
- Корректор физики ракет / корректор текстур ракет и эффекта.
- Доработки звуков / новые звуки.
- Базовые Blur фильтры.
- Переработка второстепенных блоков / Options / Menu / About / Intro.
- Полное улучшение ботов / логика преследования / 3D ракеты / Модель.
- Установка камер для обзора всех противников.
- Базовая поддержка PyOpenGL.
- Добавлено дополнительное вращение по осям / мышь.
- Частичная оптимизация текстур в формат dds / BC3-DXT5.
- Динамическая смена Звания (прозвища) за каждую медаль.
- Система поощрений (базовая версия).
- Добавлен бинарник оконного режима игры.

И многое другое...
Подробности в /Doc/Beta2.0.txt
Доработки / Дополнения файла README.linux


- Заморозка основного кода.
- Переход к созданию аддона Silver Web : Angedonia.
Аддон направлен на тактический файтинг...

- Совмещение с основной версией.
- Поддержка GLSL.



Если будет интерес к SVN контролю версий отпишите.

Silver Web Beta 2.0 / Keys Options

Немного доведён до ума Блок Options...

- Смена освещения.
- Убраны астероиды.
- Описание кнопок текстуры (GIMP).
- Смена позиций обзора.

Поскольку Beta 2.0 более стабильный релиз основы кнопок управления
заложены в норму.

19 октября 2010

Silver Web Beta 2.0 / New FX Boom

Разнообразили эффекты взрывов...
Помог хороший урок GIMP.
Русская версия урока http://gimp.ru/articles.php?article_id=11
Примеры на Шотах.

***

Возможно не совсем индивидуально... Зато смотрится хорошо.
Под Multiтекстуры самое то))).

16 октября 2010

Silver Web Beta 2.0 / Blender3D / Save+Load Property

Для отображения Заслуг (Медали) на карте использовали перенос Проперти с условием скрипта.
Скрипт любезно взят с Артиста весьма благодарны...
В синтаксис скрипта указаны изменения.
Полный листинг...



***

#-----[ Save Load Properties ]------------------------------------------------------
# Blender 2.49b
# AT-2010 16-10-2010
#
# Object must have a property named "save" for its properties to be saved.
# Saves and loads the properties of objects in active scenes. 

# This version also saves the position and orientation of the objects
#
#
#-----[ Updates ]-----#

# Aug 06-09
# Saves the GameLogic.gobalDict to a file using cPickle 
# (pickling aka marshaling)
# Better than using the logic bricks in my opinion.
#
# Aug 07-09
# Using Module with functions

# Aug 07-09
# Removed the stupid modules and functions
#
# Sept12-09
# Properties are saved in a dictionary in a dictionary in a dictionary.
#
# 16-10-2010
# No - orientation / No - position / Rename DAT file / No - Fix Load
#-----[ Controls ]-----#
#
# S key to save
# L key to load
# space to move Cube and increment a variable
#
#
#-----[ Main ]------------------------------------------------------------------         
 
import cPickle, shelve
 
import GameLogic
 
#import glob
 
c = GameLogic.getCurrentController()
owner = c.owner
 
save = c.sensors["Save"]
load = c.sensors["Load"]
 
#-----[ Object List ]---------------------------------------------------------
# Gets a list of every object in every active scene
# that you want to save.
 
sceneList = GameLogic.getSceneList()
 
saveObjList = []
 
for scene in sceneList:
    for object in scene.objects:
        if "save" in object:
            saveObjList.append(object)
                     
#-----[ Save ]---------------------------------------------------------------
# Save the properties of every object in the saveObject list.
 
# The end result is a Dictionary of every objects name,
# under each name is the stuff saved for that object.
# The Dictionary is then saved to a file.
 
if save.positive and save.triggered:
     
    for obj in saveObjList:
         
        propNames = obj.getPropertyNames()
        propList = {}
        for p in propNames:
            val = obj[p]
             
            propList[p] = val
                             
        stuff = {}
        stuff["propList"] = propList
        #stuff["position"] = obj.localPosition
        #stuff["orientation"] = obj.localOrientation
         
        GameLogic.globalDict[obj.name] = stuff
     
             
#-----[ Save to File ]-----#
    
    
    pickle_file = open("1st_SW-Medals.dat", "w")
     
    cPickle.dump(GameLogic.globalDict, pickle_file)
     
    pickle_file.close()
#--------------------------#     
     
     
    print "\n\nSaving:\n"
    for obj in saveObjList:     
        print obj.name
        print GameLogic.globalDict.get(obj.name)
 
 
 
#-----[ Load ]---------------------------------------------------------------
if load.positive and load.triggered:
     
    try:
        pickle_file = open("1st_SW-Medals.dat", "r")
        GameLogic.globalDict = cPickle.load(pickle_file)
        pickle_file.close()
     
    except(IOError), e:
         
        print """\nERROR: You've got to save the file first before 
you can load it! or as python would say:\n\n""", e
     
     
    else:
        for obj in saveObjList:
         
            theStuff = GameLogic.globalDict.get(obj.name)
         
            # Replace the object's properties with the saved ones.
            savedProps = theStuff["propList"]
         
            objProps = obj.getPropertyNames()
             
            print "\n",obj.name,"Saved props =", savedProps
             
            for prop in savedProps.keys():
                 obj[prop] = savedProps.get(prop)
         
            # Load the position and orientation
            #obj.position = theStuff["position"]
             
            #obj.localOrientation = theStuff["orientation"]     
         
             
        print "\n\nLoading:\n"
        for obj in saveObjList:     
            print obj.name
            print GameLogic.globalDict.get(obj.name)


***

- Комментирован orientation
- Комментирован position
- Смена имени выходного файла.
- Нет фикса загрузки / сейва от кнопки (для дебага).



***

Заметки...

- Имя объекта должно быть одинаково для условия загрузки Проперти.
- Для умножения скрипта меняем переменные Save / Load / save / имя файла.
- Контроль загрузки переменная save (int=0).
- Сенсоры имеют имена Save / Load
- Запуск бинарника пишит файл в корень игры.
- Запуск редактора пишит файл в корень пользователя.

15 октября 2010

Python / Скрипты / Blender3D /

Скрипт измерения расстояния от обьекта до обьекта в ед.
Метод совмещения обьектов по осям.

***

So far, it has the following abilities:
Lists distance from two selected objects in BU(Blender Units), meters,
inches, and feet
Has the ability to align objects to one of the active selected objects'
axis (Three different buttons)

***

#!BPY
# coding: utf-8
"""
Name: 'Toolset'
Blender: 249
Group: 'Misc'
Tooltip: 'Misc. Toolset'
"""

__author__ = ["Richard Perkins"]
__url__ = ("www.gameblender.org", "www.blender.org")
__version__ = "0.01"
__bpydoc__ = """\

Miscellaneous Toolset

This script contains various tools.
"""

# ***** BEGIN GPL LICENSE BLOCK *****
#
# Script copyright (C) Richard Perkins
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------

import Blender
from Blender import Draw, BGL
from math import sqrt,pow

units = {
"blender":1,
"inches":0,
"meters":0,
"feet":0
}
def event(evt, val):
if evt == Draw.ESCKEY:
Draw.Exit()
return
Draw.Redraw(1)

def button_event(evt):
global mymsg, toggle, units
if evt == 1:
meter = Blender.Object.GetSelected()
'''min = Blender.Object.Get(meter.getProperty("min").data)
max = Blender.Object.Get(meter.getProperty("max").data)'''

if len(meter) == 2 :
min = meter[0]
max = meter[1]

maxloc = max.getLocation("worldspace")
minloc = min.getLocation("worldspace")

dist_x = abs(maxloc[0] - minloc[0])
dist_y = abs(maxloc[1] - minloc[1])
dist_z = abs(maxloc[2] - minloc[2])

if units["blender"]:
globals()["dist"] =
str(sqrt(pow(dist_x,2) + pow(dist_y,2) + pow(dist_z,2))), "Blender Units"
elif units["inches"]:
globals()["dist"] = str(39.3700787 *
(sqrt(pow(dist_x,2) + pow(dist_y,2) + pow(dist_z,2)))) + " Inches"
elif units["meters"]:
globals()["dist"] =
str(sqrt(pow(dist_x,2) + pow(dist_y,2) + pow(dist_z,2))) + " Meters"
elif units["feet"]:
globals()["dist"] = str(3.2808399 *
(sqrt(pow(dist_x,2) + pow(dist_y,2) + pow(dist_z,2)))) + " Feet"
else:
globals()["dist"] = "Select Two Objects"
Draw.Redraw(1)
elif evt == 2:
selected = Blender.Object.GetSelected()
if len(selected) > 1:
for obj in selected[1:]:
loc = obj.getLocation("worldspace")
newloc =
selected[0].getLocation("worldspace")
obj.setLocation(newloc[0], loc[1], loc[2])
Blender.Redraw()
elif evt == 3:
selected = Blender.Object.GetSelected()
if len(selected) > 1:
for obj in selected[1:]:
loc = obj.getLocation("worldspace")
newloc =
selected[0].getLocation("worldspace")
obj.setLocation(loc[0], newloc[1], loc[2])
Blender.Redraw()
elif evt == 4:
selected = Blender.Object.GetSelected()
if len(selected) > 1:
for obj in selected[1:]:
loc = obj.getLocation("worldspace")
newloc =
selected[0].getLocation("worldspace")
obj.setLocation(loc[0], loc[1], newloc[2])
Blender.Redraw()
elif evt == 5:
units["meters"] = 0
units["inches"] = 0
units["blender"] = 1
units["feet"] = 0
elif evt == 6:
units["meters"] = 1
units["inches"] = 0
units["blender"] = 0
units["feet"] = 0
elif evt == 7:
units["meters"] = 0
units["inches"] = 1
units["blender"] = 0
units["feet"] = 0
elif evt == 8:
units["meters"] = 0
units["inches"] = 0
units["blender"] = 0
units["feet"] = 1

def gui():
BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
BGL.glColor3f(0,0,0)
Draw.PushButton("Update distance", 1, 10, 30, 100, 20,"A toggle
button")
BGL.glRasterPos2i(10, 55)
if not globals().has_key("dist"): globals()["dist"]="Select Two
Objects"
Draw.Text(str(globals()["dist"]))
Draw.PushButton("Align X", 2, 200, 50, 100, 20,"A toggle button")
Draw.PushButton("Align y", 3, 200, 30, 100, 20,"A toggle button")
Draw.PushButton("Align Z", 4, 200, 10, 100, 20,"A toggle button")
Draw.Toggle("BU", 5, 10,10,25,20,units["blender"],"Blender Units")
Draw.Toggle("m", 6, 35,10,25,20,units["meters"],"Meters")
Draw.Toggle("in", 7, 60,10,25,20,units["inches"],"Inches")
Draw.Toggle("feet", 8, 85,10,25,20,units["feet"],"Feet")

Draw.Register(gui, event, button_event) # registering the 3 callbacks

Multi Player Online Network Blender3D

Набор разработок в сторону Online.

- Доки.
- Скрипты.

- Basic Setup

- WSAG 3.x || Manual

- 4.00.37-WSAGbasic (blend) || Note || Forum

- WSAG 3.x Tutorial (PDF) || WSAG 4.x Tutorial (PDF)

- WSAG_IP_Lobby.zip

http://www.oldjim.ch/OJW-HP/php/home/index.php?en=wsag.html

Заметки / Python / Оптимизация

Заметки по функциям и синтаксису...

***

Caches

import math
Tan90 = math.tan(90)
def AnglyCrap(x):
    x = x*Tan90


In this script the tan of 90 gets figured out once (when the module gets imported), and then simply multiplies it by that number (-1.995200412208242) whenever AnglyCrap gets run.

***

Get_____() functions

Suck balls. They are blindingly slow, and are usually the slowest parts of any code. NEVER use a Get_____() function, if you need to get a variable that's in another module (and possibly in some dictionary, etc. you get the point) there are a million better ways to do this. For example:

CODE: SELECT ALL
import SomeModuleWithSweetDataYouWant

def LoopingFunction():
    Johnny = (SomeModuleWithSweetDataYouWant.GetSweetSweetData() * SomeModuleWithSweetDataYouWant.GetSourSourData())
    Billy = (SomeModuleWithSweetDataYouWant.GetBitterBitterData() / SomeModuleWithSweetDataYouWant.GetSweetSweetData)
    Mary = (SomeModuleWithSweetDataYouWant.GetSourSourData() + SomeModuleWithSweetDataYouWant.GetBitterBitterData())
    return (Mary - (Billy / Johnny)) + (Billy * Mary)


is a lot slower than

CODE: SELECT ALL
import SomeModule
import copy#You'll see why in the next part
Sweet =  copy.copy(SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"])
Sour = copy.copy(SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sour Sour Data"])
Bitter = copy.copy(SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Bitter Bitter Data"])

def LoopingFunction():
    Johnny = Sweet * Sour
    Billy = Bitter / Sweet
    Mary = Sour + Bitter
    return (Mary - (Billy / Johnny)) + (Billy * Mary)

***

References, is, global

Python (by default) does damn near everything by reference (so a variable usually just points to another variable, instead of actually copying the data).

Using the situation from Part 2, let's say we need to keep up with a dynamic variable:

CODE: SELECT ALL
import SomeModule

def LoopingFunction():
    Sweet =  SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"]
    Sour = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sour Sour Data"]
    Bitter = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Bitter Bitter Data"]
    Johnny = Sweet * Sour
    Billy = Bitter / Sweet
    Mary = Sour + Bitter
    return (Mary - (Billy / Johnny)) + (Billy * Mary)


every time LoopingFunction gets called, it makes a new reference to SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"], and all that. Your initial reaction is to just do:
CODE: SELECT ALL
import SomeModule

Sweet =  SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"]
Sour = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sour Sour Data"]
Bitter = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Bitter Bitter Data"]

def LoopingFunction():
    Johnny = Sweet * Sour
    Billy = Bitter / Sweet
    Mary = Sour + Bitter
    return (Mary - (Billy / Johnny)) + (Billy * Mary)


Note: When Sweet get's used, it references a position in PHYSICAL RAM, not SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"], because then it would be no better than just referencing it like the first example of the previous part (aside from staving off Carpal Tunnel).

BUT there is a horrible, horrible flaw to this way. See, LoopingFunction (is supposed to) only see variables within it's own namespace (anything in the module that it's in), but since Sweet, Sour and Bitter all point OUTSIDE the module LoopingFunction can't see them. So you need to make sure to do:
CODE: SELECT ALL
import SomeModule

Sweet =  SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"]
Sour = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sour Sour Data"]
Bitter = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Bitter Bitter Data"]

def LoopingFunction():
    global Sweet
    global Sour
    global Bitter
    Johnny = Sweet * Sour
    Billy = Bitter / Sweet
    Mary = Sour + Bitter
    return (Mary - (Billy / Johnny)) + (Billy * Mary)


But that isn't all. You see, references can get rather flaky sometimes (especially with dynamic variables). So we need a backup plan:

CODE: SELECT ALL
import SomeModule
import copy

Sweet =  SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"]
Sour = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sour Sour Data"]
Bitter = SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Bitter Bitter Data"]

def LoopingFunction():
    global Sweet
    global Sour
    global Bitter
    if not (Sweet is SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"]):
        Sweet = copy.copy(SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"])
    if not (Sour is SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sour Sour Data"]):
        Sour = copy.copy(SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sour Sour Data"])
    if not (Bitter is SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Bitter Bitter Data"]):
        Sour = copy.copy(SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Bitter Bitter Data"])
    Johnny = Sweet * Sour
    Billy = Bitter / Sweet
    Mary = Sour + Bitter
    return (Mary - (Billy / Johnny)) + (Billy * Mary)

The "is" statement only checks to make sure that Sweet and SomeModuleWithSweetDataYouWant.ReallyLongDictionaryName["Sweet Sweet Data"] are using the same memory (which is way faster than doing it byte by byte like "=="). In the end it looks uglier, but is actually decently faster.

***

Grouping things

The easiest way to get the smallest amount of speed. This is best taught by example:
CODE: SELECT ALL
import SomeJazz
Billy = SomeJazz.SomeDataOutsideTheFunction
Johnny = SomeJazz.SomeMoreDataOutsideTheFunction
Mary = SomeJazz.SomeOtherDataOutsideTheFunction
Penny = SomeJazz.SomeUsefulDataOutsideTheFunction

def SomeFunk():
    global Billy
    global Johnny
    global Mary
    global Penny
    return Penny / Johnny * Mary + Penny


Everytime the Python interpreter hits a "global" statement, it has too look at some memory address to find the function - not terribly slow but it could be faster:
CODE: SELECT ALL
import SomeJazz
Billy = SomeJazz.SomeDataOutsideTheFunction
Johnny = SomeJazz.SomeMoreDataOutsideTheFunction
Mary = SomeJazz.SomeOtherDataOutsideTheFunction
Penny = SomeJazz.SomeUsefulDataOutsideTheFunction

def SomeFunk():
    global Billy, Johnny, Mary, Penny
    return Penny / Johnny * Mary + Penny


is slightly faster. Nothing even close to any of these other optimizations, but in a real-time game where there are a lot of variables that need to go through the global statement, etc. it isn't to be underestimated (and it makes your code look cleaner too). You can do this with all sorts of statements (import, del, etc.)

Silver Web Beta 2.0 / Системы Поощирения







***

Базовая версия Системы Поощирения
Будет полностью реализована в аддоне Angedonia.
Пока тестовый вариант в базовой версии.

- Уровень 1 / За Неравный Бой / Уничтожение 3х Спор.
- Уровень 3 / За Доблесть и Отвагу / Уничтожение 5ти кораблей.

Примеры на СкринШотах.

14 октября 2010

Silver Web Beta 2.0 / Ход Изменений

Ход Изменений...
(Пачка Шотов).

- Созданы Брифинги.
- Доработки кокпитов.
- Общие улучшение текстур.
- Добавлены основные Blur фильтры.
- Реализованы 3D фоны космоса.
- Перерасчет полигонов моделей.
- Общие улучшение эффектов.

И мное другое...

По плану выход к концу месяца.

Видео заметки...

http://www.youtube.com/user/aspbazi

http://sourceforge.net/projects/silverweb/

13 октября 2010

OpenGL в Python

Я хочу Вам рассказать о графической библиотеке OpenGL и её
использовании в Python. Эта статья не обучит Dас программированию
OpenGL, но после её прочтения Dы получите общее представление об этой
библиотеке и её использовании в Питоне.

OpenGL (Open Graphics Library) - это мощная графическая библиотека,
разработанная Silicon Graphics, предназначенная для быстрой работы с 2D
и 3D графикой. Она часто используется при написании как 3D-игр, так и
серьёзных научных приложений.

Разрабатывать программы под OpenGL можно на разных языках
программирования, в том числе и на Python. Правда для этого следует
установить питоновскую библиотеку PyOpenGL. Найти её можно на сайте
pyopengl.sf.net Тамже вы найдёте обширную документацию и ссылки на эту тему.

В этой статье я опишу простую программу использующую OpenGL, но я не
ставлю перед собой цель подробно описать все команды, я лишь дам общее
представление о написании таких программ и расскажу значение основных
функций. Для подробного обучения OpenGL вам следует обратиться к другим
ресурсам, некоторые из них я укажу в конце статьи.

Итак, напишем простую OpenGL - программу. В этой программе на экране
будет вращаться зелёный куб.

Начнем с импорта необходимых библиотек. В OpenGL входит основная
библиотека "opengl" и библиотека утилит "glu", а также для создания окна
и обработки различных событий используется библиотека "glut". Кроме них
нам ещё понадобится стандартный модуль sys.

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys

Теперь обнулим значение глобальной переменной rot, она будет отвечать за
вращение куба.

rot = 0

Пришло время поработать с OpenGL. В начале работы программы всегда нужно
настроить эту библиотеку должным образом, за это будет отвечать функция
InitGL. Её параметры - ширина и высота окна.

def InitGL(Width, Height):
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_COLOR_MATERIAL)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(Width)/float(Height), 0.1, 1000.0)
glMatrixMode(GL_MODELVIEW)


Вкратце опишу значения всех команд этой функции. В первой строке
изменяется цвет фона в окне OpenGL. Он задаётся в виде значений
компонентов цвета RGBA (красный, зелёный, синий, альфа). Эти значения
должны лежать в пределах от 0 до 1. В данном случае задан чёрный цвет.
Следующие три команды задают работу с буффером глубины, который отвечает
за то, чтобы более близкие объекты рисовались впереди дальних. Затем
командами glEnable(включить) включается освещение, и нулевой источник
света (всего их может быть 8). Вызов glEnable(GL_COLOR_MATERIAL) задёт
управление материалом (цвет и отражающие способности) предметов при
помощи функции glColor. Следующие четыре строки задают параметры
изображения объектов в зависимости от размеров окна.

Вторая функция, которую мы напишем - ReSizeGLScene. Она будет вызываться
при изменении размеров окна.

def ReSizeGLScene(Width, Height):
if Height == 0: Height = 1
glViewport(0, 0, Width, Height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
glMatrixMode(GL_MODELVIEW)

Эта функция очень похожа на конец InitGL. Так как размеры окна
изменились, то следует изменить параметры изображения объектов.

Третья функция будет рисовать на экране вращающийся куб.

def DrawGLScene():
global rot
rot = (rot + 1) % 360 # увеличиваем угол поворота

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # очищаем экран
glLoadIdentity() # восстанавливаем мировые координаты

glTranslatef(0.0,0.0,-10.0)

glRotatef(rot,1.0,0.0,0.0)
glRotatef(rot,0.0,1.0,0.0)
glRotatef(rot,0.0,0.0,1.0)

glColor4f(0.0,0.7,0.1,1)
glutSolidCube(3)

glutSwapBuffers()

В начале мы увеличиваем угол поворота куба, потом очищаем экран командой
glClear и восстанавливаем мировые координаты, чтобы мир не "уплыл"
неведомо куда :) Команда glTranslatef перемещет систему координат в
определённую точку, заданную параметрами X,Y,Z. В данном случае мы
перемещаем систему на 10 пунктов вдоль оси Z в отрицательном
направлении. Каждая из команд glRotatef вращает куб вокруг вектора,
заданного последними тремя параметрами. Вначале вокруг оси X, затем
вокруг Y и Z. Командой glColorf задаём цвет куба, опять-же параметрами
RGBA. glutSolidCube(3) рисует куб с длиной стороны равной 3. Последняя
команда glutSwapBuffers() выводит всё на экран.

Теперь обработаем нажатие кнопки escape:

def KeyPressed(*args):
if args[0]=="\033": sys.exit()

Осталась только основная программа, она выглядит так:

def main():
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
glutInitWindowSize(400, 300)
glutInitWindowPosition(0, 0)
glutCreateWindow("OpenGL demo")
glutDisplayFunc(DrawGLScene)
glutIdleFunc(DrawGLScene)
glutReshapeFunc(ReSizeGLScene)
glutKeyboardFunc(KeyPressed)
InitGL(400, 300)
glutMainLoop()

main()

Здесь настраивается окно OpenGL, устанавливаются его размеры и
запускается главный цикл программы. В этой функции почти никогда ничего
не нужно менять.

Вот и всё, простейшая программа написана. Текст приведённого примера в
виде Python - файла : openglstart.py.

При просмотре других OpenGL-программ Вы заметите, насколько их код похож
на рассмотренный здесь. Действительно, чаще всего изменяется только код
функции DrawGLScene и немного InitGL, всё остальное остаётся неизменным.
Теперь Вам следует обратиться к более подробным источникам, и после
некоторого обучения Вы сможете наполнить этот простой пример своим кодом
и создать какую-нибудь мощную и красивую программу. При установке
PyOpenGL вместе c этой библитекой устанавливаются несколько отличных
примеров программ от NeHe. А на сайте nehe.gamedev.org Вы сможете найти
множество интересных обучающих программ и демонстрационных приложений.
Главным сайтом по OpenGL является www.opengl.org, здесь Вы найдете
интересные статьи, новости и ссылки на другие материалы. Я надеюсь, что
смог Вас заинтересовать, и что Вы получили общее представление о
графической библиотеке OpenGL и её использовании в Питоне.

Обучение программированию под OpenGL - дело нелёгкое и небыстрое. Этому
не научишься за один час или за один день. Опыт накапливается вместе с
числом написанных программ. Так что старайтесь при обучении побольше
экспериментировать и создавать что-нибудь своими руками - и у Вас всё
получится.

Blender 3D / Easy Motion Blur

Ущё один простой метод и не так прожорлив...
С умом самое ТО))).
Размытие при движении.

***

import Rasterizer
Rasterizer.enableMotionBlur(0.7) # Set фильтра

***

- GLSL
- Multitexture

***

По мативам http://blenderartists.org/forum/showthread.php?t=131255

Silver Web Beta 2.0 / Establishment of gas atmospheres



Небольшой видео мануал по созданию Газовых Атмосфер для игры))).

- GIMP.
- GMIC.

http://www.youtube.com/watch?v=NXeqCWC0Qio

12 октября 2010

Blender 3D / Anisotropic filtering

Заметка по фильтрам...

***

- Устанавливаем PyOpenGL.
http://pypi.python.org/pypi/PyOpenGL

***

Скрипт Импорта...

# GLSL
from OpenGL.GL import *

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8.0)


***

Значения от 1 до 16 в зависимости от Видео-ПК.

Silver Web Beta 2.0 / 3D Sky (Blender3D SkyBox)

Простой метод реализации 3D Sky (SkyBox)...
На шоте пример реализации.

***

Метод похожь на синтаксис Компаса.

- На отдельной сцене задаём камере параметры через скрипт.
- Установим сам Фон.

***

Set_Fon.py


# At-2010 / 3D Sky

co = GameLogic.getCurrentController()

obj = co.owner

obj.orientation = GameLogic.skybox_rot

***
- На игровом уровне.
- На камере где будет Фон.

***

Get_Fon.py

# At-2010 / 3D Sky


co = GameLogic.getCurrentController()

obj = co.owner

GameLogic.skybox_rot = obj.orientation

***

Как видим элементарно... Always>Python.

Можно использовать при обьемности проекта др скрипт.
Который установит Фон для всех сцен с переменной L_.

import GameLogic as g
own = g.getCurrentController().owner

sl = g.getSceneList()
getScene={}
for i in sl:
getScene[i.name]=i

for i in sl:
if i.name[:2] == 'L_':
for o in getScene[i.name].objects:
if hasattr(o, 'playerCam'):
own.orientation = getScene[i.name].objects[o.name].orientation

Где...

- L_ листинг сцен.
- playerCam обьект для передачи.

11 октября 2010

Silver Web Beta 2.0 / Три Брифинга Миссий

- Закончена работа над базовой версии брифингов.
- Основной арт выполнен в GIMP.
- Большое спс LiSUS за реализацию озвучки всех трёх брифингов.
- Озвучка содержит основные рекомендации по уровням.

10 октября 2010

BlendElf / Blender3D / Exporter

Расмотри метод экспорта файлов блендера в PAK формат для движка BlendElf.

***

Источник и описание...

http://blendelf.com/tutorial5.html

***

Бинарники можно скачать тут...

http://blendelf.com/forums/blendelf/viewtopic.php?f=3&t=12

Включают в себя как Win так и Nix сборку в одном.

***

Скрипты экспорта лежат в папке движка (blendelf-0.9-beta3).
- /blendelf-0.9-beta3/tools/
- blender_pak_exporter_fast.py для Blender3D 2.49b второй для Blender3D 2.54

- Скрипты открываются через меню блендера (Open...) Text.
- В меню Export пока появление скрипта не ожидайте.

После Open скрипта смело жмём Alt+P.

В editorelf открываем фаил PAK.

***

Камни...

- Переименовать экспорт фаил в PAK расширение.

- API (логика) задаём обьекту проперти String / имя shape / свойства BOX.

shape - type String, available values [BOX|SPHERE|MESH|CAPSULE_X|CAPSULE_Y|CAPSULE_Z|CONE_X|CONE_Y|CONE_Z]
mass - type Float, a positive floating point value
lin_damp - type Float, a positive floating point value
ang_damp - type Float, a positive floating point value

- Карты normal + displacement смотрим Шот выше.

- Скрипты (python) создать в меню скриптов новый с названием по типу Radar.lua

задаём обьекту проперти String / имя script / свойства Radar.lua.

- Armatures

When exporting armature from blender to BlendELF, there is only one thing you have to take into account. The position and the orientation of the armature MUST BE EXACTLY THE SAME with the entity the armature is deforming. Otherwise the animations won't look right.

09 октября 2010

Silver Web Beta 2.0 / New GamePlay

- Глобальные доработки поведения ботов (скрипт).
- Ракеты игрока и Ботов наводятся на друг друга (скрипт).
- Ракеты Ботов и игрока на водятся на корабли (скрипт).
- Доработки управления / плавность / смена гравитации (скрипт).
- Глобальные доработки разности скорости ракет и лазера / Игрок / Боты.
- Новая версия заставок и Интро.
- Брифинги пока в доработки.
- Смена камер для обзора целей.

***

Видео обзор...



http://www.youtube.com/watch?v=0pCJRZwON8o

07 октября 2010

Silver Web Beta 2.0 / Blender3D примеры использования выражений

На Шоте логика использования однокнопочного элемента...

***

Задача логики Добавить / Удалить тактичискую сетку одной кнопкой.
Контроль логики выражением vis >= 2 .

Где расчёт Проперти vis происходит по методу Больше или Равно.
Если больше / удалить второй элемент и наоборот добавить.

Blender3D / Crystal Space Engine / Ubuntu 10.04.1

ЗаметКО по развёртке движка...

***

Для начала установим сам движок из Репы...

$ sudo apt-get install crystalspace

Так же там есть dev и doc пакеты.

Перед дальнейшей развёрткой советуем почитать...

http://ubuntuforums.org/showthread.php?t=782789

Ещё более подробно тут ...

http://www.ogre3d.org/forums/viewtopic.php?f=1&t=56799
<http://www.ogre3d.org/forums/viewtopic.php?f=1&t=56799>

***

После общего курения скачаем скрипт...

http://www.svmres.org/arxius/CrystalPack.sh

***

#!/bin/sh

JAM="jam -j2"


if [ ! -f ~/.csbuilderrc ]; then
echo "No config file found, creating it with default values"
echo "
CSSRC=~/src/crystal
export CRYSTAL=\$CSSRC/CS
export CEL=\$CSSRC/CEL
export B2CS=\$CSSRC/b2cs
" >> ~/.csbuilderrc
fi

. ~/.csbuilderrc

if [ -z "$CSSRC" -o -z "$CRYSTAL" -o -z "$CEL" -o -z "$B2CS" ]; then
echo "Missing variables, exiting"
exit 1
fi

echo "#############################################"
echo "Checking dependences"
echo "#############################################"

DEPLIST="
subversion
jam
scons
swig
python-4suite-xml
libsdl1.2-dev
libtiff4-dev
libopenexr-dev
python-dev
build-essential
nvidia-cg-toolkit
libode0-dev #(сменим на libode-dev)
libpng12-dev
libjpeg62-dev
libogg-dev
libvorbis-dev
vorbis-tools
libfreetype6-dev
libmng-dev
libcegui-mk2-dev
xorg-dev
libglu1-mesa-dev
libglut3-dev
libopenal-dev
libalut-dev
"

for PACKAGE in $DEPLIST; do
if [ ! -z "$(dpkg -s $PACKAGE 2> /dev/null | grep "install ok
installed")" ]; then
echo "Ok: $PACKAGE"
else
echo "Missing: $PACKAGE"
PENDING="$PENDING $PACKAGE"
fi
done

if [ ! -z "$PENDING" ]; then
echo "Trying to install missing packages:"
echo $PENDING
sudo aptitude install $PENDING
echo "Please re run this script"
exit 0
fi


echo "All found, starting build phase"

echo "#############################################"
echo "Updating working copies"
echo "#############################################"

if [ ! -d $CRYSTAL/.svn ]; then
echo "No CrystalSpace working copy found at $CRYSTAL, checking it out"
mkdir -p $CRYSTAL
svn co
https://crystal.svn.sourceforge.net/svnroot/crystal/CS/branches/release/V1.4
$CRYSTAL
else
echo "SVNupping Crystalspace..."
svn up $CRYSTAL
echo "Done"
fi

if [ ! -d $CEL/.svn ]; then
echo "No CEL working copy found at $CEL, checking it out"
mkdir -p $CEL
svn co
https://cel.svn.sourceforge.net/svnroot/cel/cel/branches/release/V1.4 $CEL
else
echo "SVNupping.. CEL..."
svn up $CEL
echo "Done"
fi

if [ ! -d $B2CS/.svn ]; then
echo "No Blender2Crystal working copy found at $B2CS, checking it out"
mkdir -p $B2CS
svn co
https://b2cs.delcorp.org/svn/blender2crystal/branches/release_0_7_0 $B2CS
else
echo "SVNupping Blender2Crystal..."
svn up $B2CS
echo "Done"
fi

echo "#############################################"
echo "#BUILDING $CRYSTAL"
echo "#############################################"

cd $CRYSTAL

./configure --without-java --without-3ds --without-perl --without-caca
$JAM || fix_errors || $JAM

echo "#############################################"
echo "#BUILDING $CEL"
echo "#############################################"

cd $CEL

./configure
$JAM || fix_errors || $JAM

echo "##############################################"
echo "Please, copy B2CS/scripts to your blender/scripts directory."
echo "Then, set CRYSTAL,CEL and LD_LIBRARY_PATH variables before launch
blender."
echo "Example: "
echo "export CRYSTAL=~/crystal/CS"
echo "export CEL=~/crystal/CEL"
echo "export LD_LIBRARY_PATH=$CRYSTAL:$CEL"
echo "And then execute your blender"
echo "##############################################"
echo "Script created by Whirm and modified by Reload AT-2010."


***

Скрипт автоматезирует установку НО CS должет быть установлен.

В Ubuntu 10.04.1 пакет libode0-dev имеет вид libode-dev поэтому поправим
скрипт.
После полуторочасовой сборки перед запуском Blenderа делаем импорт...

$ export CRYSTAL=~/crystal/CS
$ export CEL=~/crystal/CEL
$ export LD_LIBRARY_PATH=$CRYSTAL:$CEL

***

Пока толку от экспортёра мало. Старая версия... SVN не работает.
Возможно с выходом Blender3D 2.5 толку будет больше.

Update Blender 2.49 BGE (Blender Game Engine) Scripts to 2.5x

ЗаметКО по API Blender3D 2.5...

- Смена синтаксиса.
- Смена API.
- Переход на Python 3.1

***

Убунтимся...

$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install python3 python3-minimal

Для работы хватит (для сборки обратитесь к руководству) .

***

Перед конвертом синтаксиса убедится в работоспособности скрипта под
Blender 2.49.
(игноры кода old_way is deprecated, please use new_way instead) .

Например, если вы используете устаревший GetOwner () метод
SCA_PythonController, вы получите следующее:

$ Method getOwner() is deprecated, please use the owner property instead

В этом случае, заменить GetOwner ()...

1 - GameLogic.getCurrentController().getOwner()
2 - На GameLogic.getCurrentController().owner

Еще одно изменение в 2,49 пользовательские свойства хранятся для
объектов. До 2,49 пользователи будут использовать атрибут стиля доступа
для этих свойств (my_ob.foo).

# Check to see if my_ob has the property 'foo'
if hasattr(my_ob, 'foo'):
bar()

Однако, поскольку это было уже устаревшим в Pythonе пришло на смену...

# Check to see if my_ob has the property 'foo'
if 'foo' in my_ob:
bar()

После того как все работает нормально в 2,49 без каких-либо
предупреждений мы готовы перейти к 2,5.

***

Есть одно изменение, которое делает смену сценариев. До 2,5 при
обращении к объектам по названию, вы должны были использовать "ОВ"
префикс. Например:

$ my_ob = GameLogic.getCurrentScene().objects['OBmy_ob']

Хотя префикс по-прежнему используется внутренне он больше не
используется в API. Это делает работу немного лучше, но ломает старые
сценарии. К счастью, это легко обновить,удалить префикс вот так:

$ my_ob = GameLogic.getCurrentScene().objects['my_ob']

***

Еще одно изменение в 2,5 API является введение псевдонимов для всех BGE
модулей. И старые и новые рабочие имена в 2,5. Однако, GameLogic больше
автоматически не импортирует, вы должны добавить "import GameLogic" в
верхней части ваших сценариев.
Следующим образом:


2.5 2.49
bge N/A
bge.logic GameLogic
bge.render Rasterizer
bge.events GameKeys
bge.constraints PhysicsConstraints
bge.types GameTypes
bge.texture VideoTexture

***

Blender 2.5 использует Python 3.1 пожтому некоторые сценарии обнавлены...
Подробней см тут http://docs.python.org/py3k/whatsnew/3.0.html

Есть два изменения, которые чаще всего влияют на BGE скрипты...

$ print "foo" используем как print("foo")

Кроме того, оператор деления (/) в настоящее время использует "real"
по два целых числа, в отличие от целочисленного деления.

Используйте / вместо целочисленного деления //.

05 октября 2010

Silver Web Beta 2.0 / Blur при ускарении / Blender3D фокус BGE

Решено добавить при движении корабля Blur эффект.
Цель сглаживать при движении и наоборот задать чёткость при стопоре.
Метод прост но есть и камни...

***

На Шоте часть логики корабля (где установлена значения не имеет) кому удобно камера кому сам обобьет.
Наша задача (на Шоте тест версия) при ускорении включить балансировку резкости а при Реверсе вернуть.

За основу взят пример скриптов Буржуйской Мысли (найти на шарашных сайтах можно)...

***

Начальная установка фильтра...



import GameLogic as G
 
C = G.getCurrentController()
mouseUp = C.getSensor("wheelUp")
mouseDown = C.getSensor("wheelDown")
own = C.getOwner()
 
#if mousewheel moves up, make focus further
if mouseUp.isPositive()  and not mouseDown.isPositive():
    own.focaltarget -=0.02
     
#if mousewheel moves down, bring focus closer
if mouseDown.isPositive() and not mouseUp.isPositive():
    own.focaltarget +=0.02
 
if own.focaltarget < 0.1: own.focaltarget = 0.1
if own.focaltarget > 1.0: own.focaltarget = 1.0
#then always blend, for smooth transition
own.focus = own.focaltarget * 0.1 + own.focus*0.9

Тут обратим внимание лишь на wheelUp и wheelDown - это название сенсоров.

Этот блок кода ...

if own.focaltarget < 0.1: own.focaltarget = 0.1
if own.focaltarget > 1.0: own.focaltarget = 1.0
#then always blend, for smooth transition
own.focus = own.focaltarget * 0.1 + own.focus*0.9

Пока не трогаем (шаг при котором идёт увелечение или уменьшение).

***

Нам для разбора понадобится FocusV.py и FocusU.py

Обратите внимание что обращение происходит в Пульс моде и Always.
А также кнопки баланса к скрипту  SetFocus.py (это вашь скрипт контроля).

А установки фильтров в FocusV.py и FocusU.py происходит включение (у нас) с любой кнопки.

***
FocusV.py


//# Setup Textures
uniform sampler2D bgl_RenderedTexture;
uniform sampler2D bgl_DepthTexture;
uniform float focus;
 
void main()
{
    //# tap controls quality, max is the max blur limit
    const float tap = 1.0;        // higher = nicer = slower
    const float max = 0.001;        // clamp max blur size
    float aperture;
     
    //# init stuff
    vec2 texcoord = gl_TexCoord[0].st;
    vec4 sum = vec4(0.0,0.0,0.0,0.0);
    float i=0.0;
 
    //# autofocus
    //focus = texture2D(bgl_DepthTexture, vec2(0.5,0.5)).r;
     
    //# Find the distance away from the focus, using Z values
    float depth = texture2D(bgl_DepthTexture, texcoord).r;
    float delta = abs(depth - focus)*abs(depth - focus)/(tap);
    delta = clamp(delta, -max, max);
 
 
    //# blurs
    for( i= -tap ;i < tap; i=i+1.0)
    {
        sum += texture2D(bgl_RenderedTexture, texcoord + vec2(i,i)*delta);
    }
 
    gl_FragColor = sum/(2.0*tap);
     
 
}



Тут нам больше всего понадобится блок...


const float tap = 1.0;   / старт значение  
const float max = 0.001; / макс значение

Сразу скажим что эти значения в FocusV.py и FocusU.py должны быть одинаковы иначе фильтр зальёт вам всё белым светом.

 ***

FocusU.py

//# Setup Textures
uniform sampler2D bgl_RenderedTexture;
uniform sampler2D bgl_DepthTexture;
uniform float focus;
 
void main()
{
    //# tap controls quality, max is the max blur limit
    const float tap = 1.0;        // higher = nicer = slower
    const float max = 0.001;        // clamp max blur size
    float aperture;
     
    //# init stuff
    vec2 texcoord = gl_TexCoord[0].st;
    vec4 sum = vec4(0.0,0.0,0.0,0.0);
    float i=0.0;
 
    //# autofocus
    //focus = texture2D(bgl_DepthTexture, vec2(0.5,0.5)).r;
     
    //# Find the distance away from the focus, using Z values
    float depth = texture2D(bgl_DepthTexture, texcoord).r;
    float delta = abs(depth - focus)*abs(depth - focus)/(tap);
    delta = clamp(delta, -max, max);
 
 
    //# blurs
    for( i= -tap ;i < tap; i=i+1.0)
    {
        sum += texture2D(bgl_RenderedTexture, texcoord + vec2(i,-i)*delta);
    }
 
    gl_FragColor = sum/(2.0*tap);
     
 
}

Видим что Сеты параметров равные. Можете поиграться с авто фокусом.
Настройки сугубо ваше дело.
Полную версию нашего точива можно будет увидеть в Beta2 Сильвера.

***

Камни...

Если вы в игре используете фильтр и у вас есть Scena перехода то ОБЕЗАТЕЛЬНО выключите фильтры а не удалите иначе получите ошибку сегментациии (на Шоте).

При переходах на отдельный .blend файл проблем не замечено.




Blender3D Скрипт фиксации растояния / дистанции

Заметка по методу...

- Движок не разгрузит.
- Цель скрипта повысить пару FPS за счёт расстояния загрузки отображения предметиков.
- Не путать с динамической загрузкой.

***

# AT-2010 CamVis

scene = GameLogic.getCurrentScene()
objList = scene.objects
 
cam =  objList['OBCamera']
 
for obj in objList:
    if "vis" in obj:
        lod_obj = obj
        print lod_obj
        if cam.getDistanceTo(lod_obj)>15.00:
            lod_obj.setVisible(False)
        else:
            lod_obj.setVisible(True)


***

Где -vis- проперти скрываемых объектов.


               

Silver Web Beta 2.0 / Последнии Изменения

Выход версии Beta 2.0 будет двойной.

- Графические улучшения.
- Смена управления / улучшение логики.

***

На данный момент выполнено...

- Доработки блока Intro / текстуры / фон / свет.
- Доработки блока Menu / текстуры / свет / эффекты.
- Доработки блока Options / текстуры.
- Для всех уровней  реализация станции портала концовки уровня.
- Базовая версия fx пыли-камней / добавляется всегда.
- Для всех кораблей баланс скорости корабля / смена гравитации (скрипт) / кнопка ускорения.
- Перерасчёт логических вычислений.
- Перемещение-наводка ракет ботов в 3D.

И многое другое...

Пока без поддержки GLSL. Но аддон планируется создать с поддержкой GLSL.

http://sourceforge.net/projects/silverweb/

04 октября 2010

Silver Web Beta 2.0 / Новая физика движения / Смена гравитации Blender3D

Раздумывали о плавной модели (физ поведения) корабля...
Решение не заставило долго ждать...

***

Все мы знаем о физ модели Blender3D 2.49b скажим видели примеры да и у нас...
При столкновении Модели начинают изображать по осям вращения такие песни что ужас))).
Кто то считает это Экшно кто то использует спецом...
Но всё же надо создать плавность в нашем примере космическую...))).

***

Нам поможит простой Python скрипт.

GameLogic.setGravity([ 0.2, 0.0, -0.4])

Где...

- GameLogic.setGravity / устанавливаем обращение к движку.
- ([ 0.2, 0.0, -0.4]) сила гравитации по осям x-y-z.

***

Зачем это и как реализовать?

- В нашем примере это корабль.
- Ваш пример может и машина.

Как видно на шотах сенсор Delay всегда цикличность через 150 единиц задаёт гравитацию по скрипту. Это даёт общию плавность по осям без линейного движения...

А второй скрипт при столкновении с Ботом или Ракетой меняет гравитацию на силу движения (у нас плавный занос по x).

Через 150 Delay возвратит начальную гравитацию))).

***

В целом вы уже надеюсь догадались как и что будет.
Если это машина (фррр не авто фаны) к примеру то...

- Начальная Грави GameLogic.setGravity([ 9.2, 0.0, 0.0])
- При столкновении с др машиной GameLogic.setGravity([ 9.2, 1.4, 0.9])

Занос пойдёт по осям Y-Z. Но это просто пример поэтому расстановка значений дело ваше и экспериментально...

Удачных заносов....

03 октября 2010

Сектор Лирики / Silver Web / Космические Симуляторы / Примеры разработок

Небольшая заметка на тему опоры по разработке Space жанра...

***

Рассмотрим три Игры - Три кита способных поставить нас на верный курс.

- Starmaggedon2
- Starshatter
- FreeSpace2

Начнём разборку полётов...
О истории и о самих играх писать не будем да и не нужно.

Starmaggedon2 - в этом примеру хороший баланс для глаза Блендер Мена))).
Поскольку низкая многоканальность и арт дизайн. С этой игрушки разумно подчеркнуть методы...

- Фон космоса
- Эффекты мусора
- Эффекты взрывов
- Простой и чёткий дизайн поверхностей планет при миссиях на орбите.
- Основной набор логики для линейного сюжета.

Словом если Бум-Бум в таких жанрах то первый заход в эту степь.
Но упаси вас Блендер остановится на таком фуфле))).

***
Starshatter - вот тут и начинаются часы досуга и мысленной мастурбации...

- Чётко показаны методы управления.
- Способы реализации тактики (любой).
- Способы взаимодействия с Ботами.
- Нюансы (при взрыве задевает вас и тд.)
- Много размышлений на тему - Хочу создать качество))).

***

FreeSpace2 - а вот тут при наборе опыта...

- Изучение общего интерфейса игрока от А до Я.
- Изучение гемплея в отношении боевой тактики.

Список богат поэтому проще поиграть.
Игры уже старые (для кого?) поэтому найти или запустить труда не составит.

Мы тестили и изучали вообще под Wine))).

***

Удачи. Отпишите если найдёте достойный пример.

02 октября 2010

Silver Web Beta 2.0 / The effect of the asteroid field (Blender3D Эффект Звёзд)

Видео обзор прошлого разговора о FX звёзд и мусора...
Метод себя оправдал.

- Маленькая нагрузка движка.
- Корректививив связки Delay + Random хорош.

Можно смело переменять в использовании звёздного неба.

Silver Web Beta 2.0 / FX Asteroid

Наработка FX астероидного поля.
За основу взят FX из Space Interceptor...

***

В Space Interceptor мы видим при полётах к астероидам динамичное добавление мелких камней с частицами...
Блендер конечно нам не даст полной копии. НО похитрим...
Сама логика реализации крайне проста.

- Второй слой сам Астероид.
- Перед кораблём (расстояния сугубо ваше дело) расположим Empty и околичествее решите сами.
- Наша задача добавлять при полёте куски местами поэтому расположим на локации к примеру Кубы в тех местах где скопления астероидов.
- При касании Empty чётко добавит нам Астероиды.

Смотрится хорошо. Как будто динамическая подгрузка))).
Можно прописать Random.
И конечно такими методами либо кусками либо Alweys всегда можно показать движение звёзд при полёте (поговорим об этом позже).

Всё зависит от задумке и получаем метод реализации.
Только не Крита ните Движок обилием объектов))).

01 октября 2010

Silver Web Beta 2.0 / Briefing

Наработки Тактического Брифинга после описания задачи.

- Вераятный противник.
- Советы по тактике.
- Карта уровня сделана снимком сетки Блендера.
- В основном Худ работы.

Сектор Лирики / Разработка компьютерных игр

Обзор

Разработкой видеоигр занимается разработчик, который может быть
представлен как одним человеком, так и фирмой. Обычно крупномасштабные
коммерческие игры разрабатываются командами разработчиков в пределах
компании, специализирующейся на компьютерных или консольных играх.
Разработка AAA проекта стоит от миллиона долларов и более. Средний
бюджет проекта колеблется от 18 до 24 млн долл. Если речь идёт о
продукте для одной единственной платформы, то его стоимость составит
около 10 млн долл.[1] Для российских компаний разработка среднего
проекта обходится в среднем от 100 тысяч до миллиона долларов. Стоимость
разработки маленьких российских проектов идет от 10 тысяч долларов.[2]
Разработку обычно финансирует издатель, хотя последнее время появляются
успешные примеры финансовых вливаний из индустрий, не связанных с
геймдевом [3] [4]. Процесс разработки обычной современной игры занимает
около года, для ААА-проектов может затянуться до 2-3 лет, цикл
разработки обычных «казуальных» игр занимает порядка 4-6 месяцев, при
том, что идет конвейерная разработка сразу 2-3 проектов. [5]
[править]Специализации

В начале 1980-х, в раннюю эпоху домашних компьютеров и игровых
приставок, единственный программист мог управлять почти всеми задачами
разработки игры. Однако разработка современных коммерческих видеоигр
предполагает наличие широкого круга навыков и персонала поддержки. Как
результат, для работы над одним проектом часто требуются целые команды.
В состав типичной современной команды разработчиков обычно входят
представители разных специализаций.
[править]Графический контент и ассеты (художники)
арт директор — как правило, это наиболее опытный и уважаемый член
команды, из занимавшихся созданием контента, его задачей является
контроль качества и времени создания контента, а также слежение за
работой художников в едином ключе
2D художник — основная его задача создание двухмерных персонажей для
соответствующих игр (флэш игры, некоторые браузерные игры, игры для
социальных сетей и тд), также их работы используются в рекламных и
маркетинговых компаниях, при создании сайта игры для взаимодействия с
игровым сообществом, для наполнения инсталятора игры, позволяя им по
мере набора опыта становиться: концепт художником, дизайнером интерфейса
или 2D художником в нетрёхмерном проекте, либо художником по текстурам
концепт художник — экономит не меньше, чем программист утилит, время по
созданию контента, его задачей является отправить черно-белые, и
возможно, впоследствии раскрашенные наброски на утверждение
арт-директору, продюсеру, инвесторам, директорату или службе контроля
качества лицензиата сеттинга, чтобы впоследствии донести их идеи и
виденье игры до всех остальных художников проекта, оказывая при этом
неоценимую помощь в руководстве по созданию контента арт директору
художник по текстурам — очередная специализация 2D художника, который
способен создать скин для 3D модели в соответствии с концептом
3D моделер — как следует из названия, создают 3D сетки моделей зданий,
техники в LightWave, 3d Studio Max, Maya и др., по мере набора опыта и
при наличии навыков некоторые становятся моделерами персонажей
моделер персонажей — 2 узкоспециализированных подкласса 3D моделеров,
создающих высокополигоналные модели танков, звездных кораблей и прочей
техники, либо органики, впрочем превращающихся иногда бампмеппингом,
нормалмеппингом в низкополигональные модельки для наиболее экономного
расходования полигонального бюджета
аниматор или mocap studio — более старым методом создания движения
является key framing, который до сих пор используется для анимирования
негуманоидных монстров, техники, и нереальных для исполнения живым
актером движений; mocap является более современным методом дающим, более
плавную и реалистичную картину движения гуманоидного персонажа
художник спецэффектов (FX) — художник, разрабатывающий специальные
эффекты (взрывы, системы частиц и т. д.)
[править]Дизайн (геймдизайнеры)
ведущий дизайнер — помимо генерации и развития основной идеи, его
задачей является координация работы остальных дизайнеров; его работа
построена на тесном взаимодействии с арт директором и ведущим
программистом и заключается не только в добавлении идей в игру, но и в
определении того, что стоит в неё вносить; помимо этого он выполняет
задачи, с которыми не в состоянии справиться дизайнерская команда
дизайнер игровой механики — как правило он в прошлом был программистом и
представляет как идеи превращаются в код, в задачу дизайнера по механике
входит, получив идею от ведущего дизайнера, пообщавшись с дизайнером
миссий или уровней, составить список требований программистам; а дальше
многократно проигрывая отдельные фрагменты игры, получить представление,
насколько их понимание игровой механики сбалансировано
дизайнер миссий или уровней — им может быть скриптовик, пишущий код для
встроенного в игру интерпретатора или художник, создающий игровую карту
в редакторе уровней или кто-то еще просто описывающий на формальном
языке из чего должен состоять уровень
дизайнер UI — разрабатывает функционал пользовательского интерфейса,
иногда собирает его из контента предоставленного художниками с помощью
инструментов, сделанных программистами
сценарист — в отличие от писателя или сценариста в кино его
повествование должно быть интерактивным и, как следствие, он должен
постоянно обсуждать дальнейшее развитие сюжета с дизайнерами, чтобы
определить, что возможно сделать на скриптовом языке, в редакторе карт и
иных утилитах. Как и у коллег по литературе и кино он должен владеть
родной речью и литературным языком, этот талант сродни музыкальному
слуху, позволяет тону и словам произносимым игровыми персонажами звучать
реалистично
[править]Звук
инженер по звуковым эффектам — ищет нужный звук в библиотеке, либо
записывает новый с натуры, либо синтезирует подходящий из одного и более
существующих
композитор — создает или синтезирует музыкальное оформление для игры
актёры озвучивания — озвучивают персонажей
[править]Контроль качества (тестеры)
Единственный способ убедиться в качестве игры — это поиграть в неё, в
небольших компаниях на начальных стадиях за качество отвечает линейный
продюсер, в более крупных проектах обосабливаются следующие команды:
QA (контроль качества) команда издателя — как и все отслеживают дефекты
в контенте и баги, как правило указывая при этом какие баги править в
первую очередь, наиболее жестко из всех следят за тем, чтобы разработка
укладывалась в график
QA основная — внутренняя команда разработчика, оценивает одиночный режим
игры
QA мультиплеер — если игра будет позиционироваться как мультиплеерная,
то создается отдельная команда, которая им занимается
QA внешняя — чтобы получить независимый взгляд, иногда оплачиваются
услуги профессиональных тестировщиков аутсорсеров, т.к. они не
участвовали в разработке, у них лучше получается выявлять баги в кривой
обучения игрока
QA совместимости — если игру помимо консолей планируется выпустить на
ПК, ее гоняют на нескольких десятках самых различных конфигураций;
проверяется правильность настроек производительности и поддержка
основной массы «железа»
QA локализации — проверяется качества перевода
бетатестеры — это неоплачиваемые фанаты будущей игры, которые захвачены
идеей ее улучшить еще до релиза, в случае откровенно слабого тайтла
издатель может принять решения об отмене бетатестирования, тк помимо
того, что оно в любом случае удлиняет сроки разработки, в данном случае
оно еще и не позволяет «продавить» рынок под эту игру увеличением
маркетингового бюджета. Единственным исключением здесь являются
массивные многопользовательские игры, которые в силу специфики их
монетизации в любом случае выигрывают от бетатестирования
управляющий бетатестированием — как правило это линейный продюсер или
сопродюсер, которому достается наиболее стрессовая часть общения с
фанатами, которые обычно очень эмоционально описывают баги и требуют
новые фичи.
[править]Программирование (инженеры)
ведущий программист — до 90-х гг мог быть единственным
программистом[источник не указан 142 дня], как правило, это программист
с наибольшим опытом, и не обязательно руководитель, т. к. иногда
управление кодингом складывается на технического директора, которому
отчитываются руководители отделов
технический директор — в крупных компаниях отвечает за качество кода и
архитектурных решений (соблюдение стандартов, возможность повторного
использования и т. д.) сразу на нескольких проектах
программист игровой механики — именно от него зависит, как игрок и
сущности взаимодействуют друг с другом, будь то удар меча по ящику или
выстрел пушки, раскидывающий всех по округе
3D-программист — от него зависит отображение мира на экране, поэтому от
него требуются глубокие познания в векторной алгебре, численных методах,
тригонометрии
программист AI — требования к нему сильно размыты при переходе от одного
к другому жанру; именно он предоставляет возможность дизайнеру уровней
задавать через тригеры и скрипты ответ окружения, мобов, NPC на действия
игрока
программист UI — создает пользовательский интефейс, позволяющий данным с
HUD воздействовать на игровую механику, будь то выбор меню или осмотр карты
программист инструментов (утилит), в т. ч. редактора уровней — наиболее
трудоёмкая должность, но именно он экономит основную часть времени
художников и дизайнеров, делая более производительные редакторы моделей,
уровней, тригеров, игровых параметров и прочего контента
программист сетевого кода — создаёт сетевой движок игры для поддержки
мультиплеера, кооператива, скачивания обновлений и т.д.
В последнее время программистов часто называют инженерами (от
английского software engineer).
[править]Управление (продюсеры)
линейный продюсер — решает повседневные вопросы компании, начиная от
заказа ужина для заработавшихся работников и прохладительных напитков в
жаркий день, заканчивая рассылкой свежих билдов бета тестировщикам и
издателю, следит за тем, чтобы разработчики не слишком много рабочего
времени уделяли «изучению» продукции конкурентов
сопродюсер (associate) — как следует из названия, объединяет работу
нескольких команд или офисов, отвечает за обновление и доведение планов
до участников команды, отчитывается за их выполнение перед начальством
исполнительный продюсер — отвечает за составление планов и их
своевременное исполнение в контексте бюджета, ведёт переговоры с
инвесторами, издателями, заключает сделки со сторонними разработчиками,
решает кадровые вопросы
[править]Другие специальности
При разработке ММО возникает необходимость в поддержке проекта, что
влечёт за собой появление дополнительных специальностей — операторский
отдел, платёжный отдел (и создание платёжной системы), гейммастера,
отдел продаж, рекламный и т. д.
Некоторые члены команды могут выполнять несколько функций. Например,
продюсер также может быть дизайнером или ведущим программистом. Однако,
если в начале эпохи видеоигр это было обычным явлением, то сейчас, при
разработке профессиональных игр, это встречается всё реже и реже.

Процесс разработки

Процесс разработки игры меняется в зависимости от компании и проекта.
Однако разработка коммерческой игры обычно включает следующие этапы:
[править]Предпроизводственный процесс (предпродакшн)


Ранние стадии разработки игры часто характеризуются низким качеством
графики. Особенно это справедливо для различных игровых прототипов.
Обычно перед началом разработки любой игры должна сформироваться идея, а
издатель/разработчик должен дать «зелёный свет».
В более распространённом случае, если разработчик и издатель являются
разными компаниями, идея должна быть предложена руководству, одобрена и
выставлена на рассмотрение издателям. В этом деле может помочь рабочее
демо, но оно не является обязательным для авторитетного издателя с
хорошей репутацией. Если заинтересованный издатель найден, можно
начинать производство. Сегодня идея игры редко убеждает, если в ней не
заинтересован издатель.
Если разработчик также является издателем, или если они оба являются
подразделениями одной компании, то одобрение должно дать только высшее
руководство. Однако, в зависимости от размера компании-издателя, может
потребоваться несколько попыток, пока идея не поднимется вверх через все
слои руководства.
Представителем проекта обычно является геймдизайнер, но им также может
быть человек из игровой индустрии любой другой должности. Перед началом
полномасштабного производства геймдизайнер должен написать
дизайн-документ — подробный документ, описывающий концепцию и геймплей.
Также он может содержать некоторые предварительные скетчи различных
аспектов игры. Некоторые геймдизайнеры включают в дизайн-документ даже
примерный рабочий прототип, демонстрирующий одну или несколько сторон
игры. Обычно дизайн-документ объединяет в себе все или большую часть
материалов начального замысла. Основная особенность дизайн-документа —
это его «живость» — в действительности он не будет завершён до тех пор,
пока игра находится в разработке. Он может изменяться каждую неделю,
иногда — каждый день. Поэтому, даже если дизайн-документ должен
существовать в некоторой форме перед началом полномасштабного
производства, он почти никогда не является завершённым дизайном, хотя
может описывать многие аспекты всех стадий полностью спроектированной игры.
Перед тем, как появится одобренный дизайн, основная команда
программистов и художников может начать работу над идеями. Программисты
могут разработать начальные прототипы для демонстрации одной или
нескольких возможностей, которые хотят видеть в игре некоторые
посредники. Или они могут начать разработку каркаса, который, в конечном
счёте, будет использоваться игрой. Художники могут нарисовать эскизы,
как плацдарм для разработки реальных игровых ресурсов. Сначала продюсер
может работать над игрой неполный рабочий день, но повышать свою
занятость по мере продвижения разработки.
[править]Производство
На этапе основного производства выполняется огромный объём работ.
Программисты пишут исходный код, художники рисуют графику (спрайты или
3D-модели игровых элементов). Звукооператоры разрабатывают звуковые
эффекты, а композиторы пишут музыку для игры. Дизайнеры уровней создают
уровни, а писатели пишут диалоги для скриптовых сцен и неигровых персонажей.
Всё это время геймдизайнер дополняет и изменяет игровой дизайн, чтобы
отразить текущее видение игры. Некоторые особенности или уровни могут
быть удалены, некоторые добавлены. Художественная трактовка может
эволюционировать, а сюжет (предыстория) — измениться. Может появиться
новая целевая платформа, а также новая целевая аудитория. Все эти
изменения должны быть задокументированы и большинство из них должно
появиться в дизайн-документе.
С точки зрения времени, первый уровень игры разрабатывается дольше всех
остальных. Поскольку дизайнеры уровней и художники используют
инструменты для создания уровней, им требуются возможности и изменения
внутренних инструментов. С появлением новых возможностей некоторые
уровни могут устареть, поэтому, в первый уровень игры могут вноситься
различные исправления. Кроме того, в силу динамической природы
разработки игр, дизайнерское видение первого уровня с течением времени
может изменяться. Довольно обычным является потратить на первый уровень
более 12 месяцев при общей трёхлетней разработке игры. Последующие
уровни могут разрабатываться значительно быстрее, так как список
возможностей становится более полным, а видение игры — более ясным.
Тестировщики подключаются к игре, когда появляется что-то играбельное.
Это может быть один уровень или подмножество игры, которое может
использоваться в любых разумных пределах. На раннем этапе тестирование
игры отнимает у одного тестировщика относительно малую долю времени; в
любое время тестировщики могут быть ответственны сразу за несколько игр.
По мере приближения разработки к концу, одна игра может начать отнимать
у тестировщиков всё их время — и даже сверхурочно — поскольку они
стараются протестировать новые возможности, для которых существуют тесты
регрессии. Сегодня тестирование является жизненно важным для игр,
поскольку, в силу сложности большинства из них, одно единственное
изменение может привести к катастрофическим последствиям.
Поддержка
В обычном случае поддержка заключается в выпуске патчей для исправления
ошибок, найденных уже после выхода игры. Однако, в случае ММО, поддержка
может сравняться или даже превосходить производство как по трудоемкости,
так и по времени, так как успешная ММО должна непрерывно развиваться и
расширяться, чтобы избежать оттока игроков.

Сектора Лирики