1

このエラーの意味を確認するために読みました。私はそれが私に何を伝えているかを今理解しました、しかし私がそれにリストを渡すのでそれは文字通り意味がありません。リストは、私がそれらに索引を付けようとしている適切な深さのものです。もっと経験豊富な人に何が悪いのか見せてもらうと本当に助かります。

import direct.directbase.DirectStart
from direct.showbase import DirectObject
from panda3d.core import TextNode, Vec3, Vec4
from direct.interval.IntervalGlobal import *
from direct.gui.DirectGui import *
from direct.showbase.DirectObject import DirectObject
import sys
import math

global masses
global dt
global models
global xcel
global xcel2
xcel = []
xcel2 = []
models = []
masses = []
positions = []
velocities = []
dt = 0.1

class mass(DirectObject):
    def __init__(self):
        base.setBackgroundColor(0, 0, 0)
        camera.setPos ( 0, -100, 0 )         
        camera.setHpr ( 0, 0, 0 )

    def createMass(self, name, mass, pos, vel):
    self.name = name
    self.mass = mass
    self.pos = pos
    positions.append(pos)
    global positions
    self.vel = vel
    velocities.append(vel)
    global velocities

    def scaleRenderTexture(self, scale, tex):
    self.model = loader.loadModel("models/sphere")
    self.model.reparentTo(render)
    texture = loader.loadTexture("models/" + tex)
    self.model.setTexture(texture, 1)
    self.model.setPos(self.pos[0], self.pos[1], self.pos[2])
    self.model.setScale(scale)
    masses.append(self.mass)
    models.append(self.model)



class sun(mass):
def __init__(self):
        mass.__init__(self)
    self.createMass( 'sun', 1988920, [0, 0, 0], [0, 0, 0])
    self.scaleRenderTexture(1, 'sun.jpg')

class mercury(mass):
def __init__(self):
    mass.__init__(self)
    self.createMass( 'mercury', 0.3302, [3.241862599523176, -5.623459942709265, -0.7569237943021074], [3.246868365706273*0.000001, 2.673977456413460*0.000001, -7.943396297475591*0.00000001])
        self.scaleRenderTexture(0.5, 'mercury.jpg')

class venus(mass):
def __init__(self):
    mass.__init__(self)
        self.createMass('venus', 4.8685, [-1.034106071554218*10, -3.026887560710919, 5.553453628782571*0.1], [9.607057270995346*0.0000001, 9.607057270995346*0.000001, -1.017130175803783*0.0000001])
    self.scaleRenderTexture(1, 'venus.jpg')

class earth(mass):
def __init__(self):
    self.createMass('earth', 5.9736, [-1.156305861637755*10, -9.663398491949379, 3.476874978550299*0.0001], [ 1.862492028315679*0.000001, -2.296083935603351*0.000001, 9.235729792600083*0.00000000001])
    self.scaleRenderTexture(1, 'earth.jpg')

class moon(mass):
def __init__(self):
    mass.__init__(self)
    self.createMass('moon', 0.07349, [-1.159098389232509*10, -9.637310345944113, -2.989940894073912*0.001], [1.798178987142885*0.000001, -2.375339761912065*0.000001, -2.207441445869889*0.000000001])
    self.scaleRenderTexture(0.5, 'moon.jpg')

class mars(mass):
def __init__(self):
    self.createMass('mars', 0.64185, [-2.422905158679938*10, -3.744196041373893, 5.164753385142086*0.1], [ 4.606798644725879*0.0000001, -2.187755639279240*0.000001, -5.715066713235196*0.00000001])
    self.scaleRenderTexture(1, 'mars.jpg')

class jupiter(mass):
def __init__(self):
    self.createMass('jupiter', 1898.6, [4.622321051914394*10,  5.871875615908649*10, -1.278226639349561], [-1.043365341857297*0.000001, 8.709856358914491*0.0000001, 1.972500372665064*0.00000001])
    self.scaleRenderTexture(1, 'jupiter.jpg')

class saturn(mass):
def __init__(self):
    self.createMass('saturn', 568.46, [-1.301371599111853*100, -6.476615242349228*10, 6.307409695374766], [3.772024323255900*0.0000001, -8.663132035152103*0.0000001, 5.618951648515438*0.00000000001])
    self.scaleRenderTexture(1, 'saturn.jpg')

class uranus(mass):
def __init__(self):
    self.createMass('uranus', 86.832, [2.992063464452280*100, 2.476994299596707*10, -3.783759032649831], [-6.199323493736431*0.000000001, 6.475569300476019*0.0000001, 3.210008048765792*0.000000001])
    self.scaleRenderTexture(1, 'uranus.jpg')

class neptune(mass):
def __init__(self):
    self.createMass('neptune', 102.43, [ 3.919464564967463*100, -2.185268039220477*100, -4.530872464442687], [2.601721469279150*0.0000001, 4.785231712545664*0.0000001, -1.579822877152521*0.000000001])
    self.scaleRenderTexture(1, 'neptune.jpg')

class pluto(mass):
def __init__(self):
    self.createMass('pluto', 0.0125, [ 6.480526105894912*10, -4.765510811963443*100, 3.226311175584855*10], [5.496347900202217*0.0000001, -3.260693806903501*0.00000001, -1.558804760367132*0.0000001])
    self.scaleRenderTexture(0.5, 'pluto.jpg')

def calcA(bodies):
s = [0,0,0]
me = [0,0,0]
v = [0,0,0]
e = [0,0,0]
mo = [0,0,0]
ma = [0,0,0]
ju = [0,0,0]
s = [0,0,0]
u = [0,0,0]
n = [0,0,0]
p = [0,0,0]
xcel = [s, me, v, e, mo, ma, ju, s, u, n, p]
xcel2 = xcel
aX = 0
aY = 0
aZ = 0
for i in range(len(masses)):
    xcel[i] = [aX, aY, aZ]
    aX = 0
    aY = 0
    aZ = 0
    for j in range(len(masses)):
    if i!=j:
        a = models[i].getPos()
        b = models[j].getPos()
        rx = b[0]-a[0]
        ry = b[1]-a[1]
        rz = b[2]-a[2]
        r = math.sqrt(rx*rx+ry*ry+rz*rz)
        xRatio = rx/(ry+rz)
        yRatio = ry/(rx+rz)
        zRatio = rz/(rx+ry)
        acceleration = (9.81*float(masses[i]))/(r*r)
        aX = aX + acceleration*xRatio
        aY = aY + acceleration*yRatio
            aZ = aZ + acceleration*zRatio

    return(xcel)

def calcNextPos(models, xcel, velocities, dt):
for i in range(len(models)):
    for j in range(3):
        a = xcel[i[j]]*0.5*dt*dt
        v = velocities[i[j]]*dt
    positions[i[j]] = positions[i[j]] + v + a
updatePos(positions)

def calcNextVel(velocities, xcel, xcel2, dt):
for i in range(len(models)):
    for j in range(3):
        velocities[i[j]] = velocities[i[j]] + 0.5*(xcel[i[j]] + xcel2[i[j]])*dt
xcel = xcel2
return vel


def updatePos(positions):
for i in range(models):
    for j in range(3):  
    models[i].setPos(positions[i[0]], positions[i[1]], positions[i[2]])

bodies = []     
sun = sun()
mercury = mercury() 
venus = venus()
earth = earth() 
moon = moon()
mars = mars()   
jupiter = jupiter()
saturn = saturn()
uranus = uranus()
neptune = neptune()
pluto = pluto() 
xcel = calcA(bodies)

print(xcel)
print(positions)
print(velocities)
def mainLoop(xcel, models, masses, velocities):
calcNextPos(models, xcel, velocities, dt)
xcel2 = calcA(bodies)
calcNextVel(velocities, xcel, xcel2, dt)

while True:
mainLoop(xcel, models, masses, velocities)
run()

コンソールの画像は次のとおりです。

スクリーンショット

私はそれをよく調べました、そして、私はそれを理解することができません。どんな助けでもいただければ幸いです。私が使用しているAPIはpanda3dです。

ありがとう

ケイン

4

2 に答える 2

3

xcel二次元リストです。番目のサブリストjの 番目の要素にアクセスするための正しい構文は次のとおりです。i

xcel[i][j]   # not xcel[i[j]]!

j現在、 integerの th 要素を取得しようとしているiため、発生しているエラーが発生します。velocitiesとについても同様positionsです。

于 2012-04-30T08:08:27.763 に答える
0

i は整数なので

for i in range(len(models)):

これは、0 から a の長さ未満の i の値のループを作成します。models

意図した目的が何であるかはわかりませんが、次の2行の整数で起こっているように、配列要素にアクセスできませi[j]ん ということでしたか

for i in range(len(models)):
    for j in range(3):
        a = xcel[models[j]]*0.5*dt*dt
        v = velocities[models[j]]*dt

メモi[j]は今models[j]

于 2012-04-30T07:46:46.790 に答える