Форум сайта python.su
Оффтоп. Предлагаю присвоить Ferromanу звание “почетного цербера”. Без всякой иронии и в знак глубочайшего уважения.
За то, что задает очень правильные вопросы в ответ, при этом не преподнося готовое решение “на блюдечке” - но указывая правильный путь.
Офлайн
Я знал что кто-то что-то подобное предложит :)
За похвалу - спасибо.
Офлайн
SCREEN_SIZE = (800, 600)
from math import radians
from OpenGL.GL import *
from OpenGL.GLU import *
import pygame
from pygame.locals import *
# Import the Model3D class
import model3d
def resize(width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/height, .1, 1000.)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def init():
# Enable the GL features we will be using
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_COLOR_MATERIAL)
glEnable(GL_TEXTURE_2D)
glEnable(GL_CULL_FACE)
glShadeModel(GL_SMOOTH)
glClearColor(1.0, 1.0, 1.0, 0.0) # white
# Set the material
glMaterial(GL_FRONT, GL_AMBIENT, (0.0, 0.0, 0.0, 1.0))
glMaterial(GL_FRONT, GL_DIFFUSE, (0.2, 0.2, 0.2, 1.0))
glMaterial(GL_FRONT, GL_SPECULAR, (1.0, 1.0, 1.0, 1.0))
glMaterial(GL_FRONT, GL_SHININESS, 10.0)
# Set light parameters
glLight(GL_LIGHT0, GL_AMBIENT, (0.0, 0.0, 0.0, 1.0))
glLight(GL_LIGHT0, GL_DIFFUSE, (0.4, 0.4, 0.4, 1.0))
glLight(GL_LIGHT0, GL_SPECULAR, (1.0, 1.0, 1.0, 1.0))
# Enable light 1 and set position
glEnable(GL_LIGHT0)
glLight(GL_LIGHT0, GL_POSITION, (0, .5, 1, 0))
def run():
pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE, HWSURFACE|OPENGL|DOUBLEBUF)
resize(*SCREEN_SIZE)
init()
clock = pygame.time.Clock()
# Read the model
tank_model = model3d.Model3D()
tank_model.read_obj('mytank.obj')
rotation = 0.0
while True:
for event in pygame.event.get():
if event.type == QUIT:
return
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
time_passed = clock.tick()
time_passed_seconds = time_passed / 1000.0
glLoadIdentity()
glRotatef(15, 1, 0, 0)
glTranslatef(0.0, -1.5, -3.5)
rotation += time_passed_seconds * 45.0
glRotatef(rotation, 0, 1, 0)
tank_model.draw_quick()
pygame.display.flip()
if __name__ == "__main__":
run()
Отредактировано (Окт. 28, 2008 05:24:21)
Офлайн
….
да и что значит фаил *blend бинарный?
Открой с помощью блокнота, .blend и какой-нибудь .3ds и ощути разницу.
Насчет model3d - походу такого модуля в pygame нет. Зато здесь http://www.pygame.org/wiki/OBJFileLoader?parent=CookBook есть пример загрузки *.obj c текстурами, освещением, материалами.
Офлайн
Почему-то гугл на запрос “python model3d” выдаёт ссылки только на перл и яву. Питоновского модуля я не нашел (искал, правда, недолго). Может, в самой этой книжке указано, где такой модуль брать?
Вообще, может, если не знаешь, что такое “фаил *blend бинарный”, стоит сначала с основами поразбираться, не пытаясь сразу в 3D-графику влезать?
Я года 3 назад разбирался с PyOpenGL, частично написал свой парсер формата .ase (текстовый формат, экспортируемый 3DMax'ом), потом бросил, слишком медленно это в питоне, да и собственный парсер до идеала вряд-ли бы смог довести. Сейчас для 3D использую PyOgre, там всё проще, чем с голым OpenGL, есть нормальный экспортёр из Блендера, да и на сайте Ogre3d.ru русской документации прилично поднакопилось.
Офлайн
да, странный какой-то модуль. Может его в книжке где-то раньше написали? или он на диске прилагался.
на страничке pygame есть код для загрузки obj : http://www.pygame.org/wiki/OBJFileLoader
Офлайн
нет в книге нет где можно найти эти модули также я обнаружил что нет модулей matrix44 Vector3 Vector2 может это в старой версии pygame эти модули есть а в новых нет?
Отредактировано (Окт. 28, 2008 18:25:40)
Офлайн
Striver ты что предлогаеш начать изучать Pyogre думаеш поможет?
Офлайн
Lumer
Вполне может быть что всё переделали. А вообще убери книгу подальше и смотри в документацию.
Задача у тебя какая? Вполне может быть что выбранная библиотека - не лучший выбор. Может стоит посмотреть в сторону чегото более документированного с примерами. Panda3d, DirectPython, PyOgre, CrystalSpace, Irrlicht и другие
А может прямо в блендере скрипты писать?
Офлайн
Lumer: Striver ты что предлогаеш начать изучать Pyogre думаеш поможет?
Я же не знаю, твоей общей задачи, чего ты хочешь добиться… Попробую предположить:
Если ты нацелен делать игру, то без вариантов возня с PyOpenGL тебе не подойдёт. Зайди на какой-нибудь gamedev.ru или подобный ему сайт, и там тебе скажут, что если начинаешь делать свой движок, то на этом всё и заглохнет. Есть множество готовых движков, Ferroman дал тебе наводку на них. Я пользовался Ogre, доволен им. Также скачивал и пробовал Panda3D, но у неё вообще нет русскоязычных ресурсов.
Также можно использовать движок Блендера. На форуме blender3d.org.ua его много обсуждают, может, чего путное для себя найдёшь. Правда, дальше болтовни там никто не продвинулся.
Другой вариант, если ты именно с OpenGL разобраться хочешь, поизучать его и т.д. (Например, чтобы в светлом будущем крутейший движок на C++ написать). Тогда, PyOpenGL - то, что доктор прописал. А вместо model3d можешь взять другой импортёр, например Dice 3DS по ссылке Ferroman'а. Или парсить вручную, как я пытался.
Офлайн