Найти - Пользователи
Полная версия: 3D-объектом directX
Начало » Python для экспертов » 3D-объектом directX
1 2
Sunny
приветик всем ! :) Плиз, выложите примерчик с задаваемым треугольниками вращающимся 3D-объектом directX на wx панели. Сколько не искала - не могу ничего подобного найти :(
Ferroman
DirectPython

PS: между прочим - первая ссылка в гугле по запросу directx wxPython
Sunny
Это очень замечательная страничка, но вот только у меня проблема не с тем чтобы скачать directX, а с тем чтобы реализовать на нём конкретную задачу, поэтому и прошу конкретный пример причём ориентированный не на работу с спрайтами, а с заданием своего объекта.
Ferroman
4 ошибки.
1. Не вижу где я предлагаю скачать DirectX. Или Вы решили что DirectX и DirectPython - одно и то же?
2. Не вижу где я предлагаю использовать спрайты. Вы же, вроде бы, 3D модель хотели отобразить, а не 2D. К чему Вы их вспомнили?
3. Задача не конкретная. В каком формате будет задаватся меш?
4. Вы даже не пытались скачать и посмотреть DirectPython. А там в примерах, между прочим, есть пример отображения мешей в wxWidgets и Tkinter.

Сарказм - это попоытка оскорбить собеседника. Попробуйте поменять отношение к людям которые пытаются Вам помочь.
Sunny
Почему сразу всё воспринимать в штыки? Я вовсе не собиралась никого обижать или оскорблять. А вот говорить о том что человек не пытался делать не спросив его - зря. DirectPython я скачала и эти примеры видела, но пример там для 2D, переделав всё на вариант 3D и как я не бьюсь трансформация объктов у меня не получается.

А категоричность утверждений всегда должна подкрепляться фактами :)
Ferroman
Я выходил исключительно из того что Вы сказали.
Это очень замечательная страничка, но вот только
Вот это ОЧЕНЬ похоже на сарказм.
Почему сразу всё воспринимать в штыки? Я вовсе не собиралась никого обижать или оскорблять.
Да какие там штыки. Простая реакция.
А вот говорить о том что человек не пытался делать не спросив его - зря.
Да нет, не зря. Вы нигде не написали о том что скачали и о том что не получилось. Вы написали про DirectX (я его не предлагал), про спрайты (к чему бы это?). Если бы Вы скачали до того как написали мне ответ - ни про directX ни про спрайты речи бы не было. ;)
2D, переделав всё на вариант 3D и как я не бьюсь трансформация объктов у меня не получается.
На самом деле там 3D.
А повращять предмет просто.
Достаточно использовать setTransform добавляя угол поворота
(Я немного порезал пример из инсталятора, удалил лишнее)
import os
import d3d
from d3dc import *
try:
    import wx
except:
    d3d.messageBox(u"wxPython sample", 
        u"wxPython is not available.\n\nThis sample will not work without it.")
    raise
#Simple pre-transformed triangle.
triangle = (
    (10.0, 400.0, 0.5, 1.0, 0x80ffff00),
    (190.0, 10.0, 0.5, 1.0, 0x80ff00ff),
    (370.0, 400.0, 0.5, 1.0, 0x8000ff00),
)
class MainFrame(wx.Frame):
    def __init__(self, parent, id, title, pos, size=(400, 600)):
        wx.Frame.__init__(self, parent, id, title, pos, size)
                         
        self.mainpanel = wx.Panel(self, -1)
        
        self.leftwindow = wx.Panel(self.mainpanel, -1, (10, 10), (380, 450))
        self.leftwindow.SetBackgroundColour(wx.WHITE)
        useleft = wx.Button(self.mainpanel, -1, "Rotate", (100, 500))
        self.Bind(wx.EVT_BUTTON, self.useLeft, useleft)
        self.Bind(wx.EVT_PAINT, self.onPaint)
        self.Bind(wx.EVT_IDLE, self.onIdle)
        
        #Create a device that preserves its backbuffer after
        #present() by using SWAPCOPY
        d3d.createDevice(u"", u"", 0, 0, False, CREATE.SOFTWARE | CREATE.SWAPCOPY, 
            self.leftwindow.GetHandle())
            
        self.override = 0
        self.media = None
        self.mesh = d3d.StaticMesh(u"xfiles/static.bigship.x")
        center, radius = self.mesh.getBoundingVolume()
        self.scale = 10.0 / radius
        self.rotation = 0.0
        self.render() #We only have to render once, use present() to show it.
        
    def render(self):
        d3d.clear()
        d3d.beginScene()
        d3d.setState(RS.LIGHTING, True) 
        d3d.setState(RS.AMBIENT, 0x00202020)  
        d3d.setState(RS.SPECULARENABLE, True)
        d3d.setLight(0, LIGHT.POINT, 0xffff0000, 50.0, (0.0, 30.0, 0.0))
                
        d3d.setState(RS.ZWRITEENABLE, False)  
        d3d.setState(RS.ALPHABLENDENABLE, True)
        d3d.setState(RS.FVF, FVF.XYZRHW | FVF.DIFFUSE)
        d3d.drawVertices(TYPE.TRIANGLELIST, triangle)
        d3d.setState(RS.ALPHABLENDENABLE, False)
        d3d.setState(RS.ZWRITEENABLE, True)    
        d3d.setView((0.0, 28.0, -28.0,), (0.0, 0.0, 0.0))
        d3d.setTransform((0, 0, 0), (0, self.rotation, 0), (self.scale, self.scale, self.scale))
        self.mesh.render()
        d3d.endScene()
         
    def useLeft(self, evt):
        #self.override = 0
        self.rotation +=0.1
        self.render()
        #self.leftwindow.Refresh()
 
    def present(self):
        try:
            d3d.present(self.override)
        except:
            #Device is not functional. For example
            #Fast user switching or power saving modes can cause this.
            try:
                #Try to reset.
                d3d.reset()
            except:
                #Failed, try again later.
                return
            #All ok, continue as usual. The backbuffer has
            #been lost however, so we need to render it again.
            self.render()
 
    def onIdle(self, evt):    
        self.present()
                 
    def onPaint(self, evt):
        dc = wx.PaintDC(self)
        #self.present()
                             
class MainApp(wx.App):
    def OnInit(self):
        frame = MainFrame(None, -1, "DirectPython with wxPython", (10, 10), (400, 600))
        frame.CenterOnScreen()
        frame.Show()
        return True
if __name__ == "__main__":
    app = MainApp(False)
    app.MainLoop()
Sunny
:) спасибо большое, но здесь вращается структура загруженная из файла *.x а мне нужно чтобы я вращался мой набор треугольников. Если брать этот пример то вращать мне нужно triangle, которые выводятся d3d.drawVertices(TYPE.TRIANGLELIST, triangle) Или мне нужно как-то создать объект аналогичный получаемому d3d.StaticMesh(), но как ???
Ferroman
Если набор статичный - сделайте *.х меш и используйте его.
Свои треугольники в меш сразу перевести не получится, насколько я понимаю.
Sunny
:) как раз только что закончила реализовывать эту идею :) действительно работает, хотя меня чисто из любопытства интересно неужели нельзя как-либо трансформировать обычный список треугольников )))
Ferroman
Мне уже тоже интересно. Попробую узнать у автора.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB