🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

ODE(Open Dynamics Engine)

ODE(Open Dynamics Engine)は、オープンソースな3次元動力学シミュレータです。複雑な方程式の算出をせずとも、高速且つ簡単に物理シミュレーションを行うことが可能。ゲーム開発やロボット研究開発に広く用いられています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

883閲覧

衝突判定時の内部エラー

Luke02561

総合スコア404

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

ODE(Open Dynamics Engine)

ODE(Open Dynamics Engine)は、オープンソースな3次元動力学シミュレータです。複雑な方程式の算出をせずとも、高速且つ簡単に物理シミュレーションを行うことが可能。ゲーム開発やロボット研究開発に広く用いられています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/06 02:34

編集2020/06/07 02:53

前提・実現したいこと

PyGameとPyODEを使って物理演算を行いたい。

発生している問題・エラーメッセージ

ODE INTERNAL ERROR 1: assertion "nj < ~((atomicord32)0) / dJCB__MAX" failed in dxStepIsland_Stage1() [step.cpp:951]

該当のソースコード

Python

1import pygame 2from pygame.locals import * 3import ode 4import matplotlib.pyplot as plt 5import sys 6 7class Point: 8 def __init__(self, x, y): 9 self.x = x 10 self.y = y 11 12 13def near_callback(args, geom1, geom2): 14 e = 0.9 # 反発係数 15 contacts = ode.collide(geom1, geom2) 16 world, contactgroup = args 17 for c in contacts: 18 c.setBounce(e) # 反発係数の値をセット 19 c.setMu(5000) # 静止摩擦係数 20 j = ode.ContactJoint(world, contactgroup, c) 21 j.attach(geom1.getBody(), geom2.getBody()) #おそらくここに問題 22 23pygame.init() 24screen = pygame.display.set_mode((600, 400)) 25 26world = ode.World() 27world.setGravity((0, -9.81, 0)) 28 29body = ode.Body(world) 30M = ode.Mass() 31M.setSphere(25000, 0.05) 32body.setMass(M) 33body.setPosition((0, 2, 0)) 34body.setForce((0, 5000, 0)) 35 36space = ode.Space() 37floor_geom = ode.GeomPlane(space, (0, 1, 0), 0) 38ball_geom = ode.GeomSphere(space, radius=0.05) 39ball_geom.setBody(body) 40contactgroup = ode.JointGroup() 41 42fps = 50 43dt = 1.0 / fps 44frame = 0 45clk = pygame.time.Clock() 46 47histry = [] 48 49while True: 50 x, y, z = body.getPosition() 51 screen.fill((255, 255, 255)) 52 for i in histry: 53 pygame.draw.circle(screen, (200, 0, 0), (int(i.x * 100 + 100), int(-i.y * 100 + 400)), 10) 54 pygame.draw.circle(screen, (0, 0, 200), (int(x * 100 + 100), int(-y * 100 + 400)), 10) 55 pygame.display.update() 56 57 if frame % 5 == 0: 58 histry.append(Point(x,y)) 59 60 61 space.collide((world, contactgroup), near_callback) 62 world.step(dt) 63 contactgroup.empty() 64 65 clk.tick(fps) 66 frame += 1 67 events = pygame.event.get() 68 for e in events: 69 if e.type == QUIT: 70 pygame.quit() 71 sys.exit()

地面(floor_geom)とボール(ball_geom)が衝突したときにエラーが発生しています。
なので、コードの

j.attach(geom1.getBody(), geom2.getBody()) #おそらくここに問題

の部分に問題がありそうです。(この行をコメントアウトするとエラーは起きず、衝突後の反発もありません)

解決方法や原因はありますか?エラーの意味だけでも助かります

補足情報(FW/ツールのバージョンなど)

Python3.7.5
Pygame 1.9.4.post1
Py3ODE 1.2.0.dev15
使用プロセッサーのタイプ(?) aarch64

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問