Java ARCore-从Modelrenderable列表中选择不同的三维对象

Java ARCore-从Modelrenderable列表中选择不同的三维对象,java,android-fragments,fragment,augmented-reality,arcore,Java,Android Fragments,Fragment,Augmented Reality,Arcore,我正在制作一个与宜家家居应用程序非常相似的应用程序。首先,所有产品都将从第一个活动的列表视图中列出。单击某个产品时,该产品的所有信息将显示在CardView表单中的新活动中。下面将有“预览”和“添加到购物车”按钮,这将引导您进入下一步,或者在AR中作为真实3D对象预览产品,或者您可以直接将产品添加到购物车并转到付款步骤。现在我面临的问题是,每个产品都有自己的3D对象预览,但它们总是在AR中显示相同的3D对象。当您想在AR中预览不同的人时,我应该如何让应用程序知道何时选择相应的对象?这是我的密码

我正在制作一个与宜家家居应用程序非常相似的应用程序。首先,所有产品都将从第一个活动的列表视图中列出。单击某个产品时,该产品的所有信息将显示在CardView表单中的新活动中。下面将有“预览”和“添加到购物车”按钮,这将引导您进入下一步,或者在AR中作为真实3D对象预览产品,或者您可以直接将产品添加到购物车并转到付款步骤。现在我面临的问题是,每个产品都有自己的3D对象预览,但它们总是在AR中显示相同的3D对象。当您想在AR中预览不同的人时,我应该如何让应用程序知道何时选择相应的对象?这是我的密码

ProductFragment.java

package com.example.myar;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

import com.nex3z.notificationbadge.NotificationBadge;


public class ProductFragment extends Fragment {

private NotificationBadge badge;
package com.example.myar;

import android.content.Intent;
import android.os.Bundle;

import android.util.Log;
import android.view.MenuItem;

import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;


import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;

import com.example.myar.RoomDatabase.ModelDB.Cart;
import com.google.gson.*;


public class ProductViewActivity extends FragmentActivity {
    Toolbar productToolbar;
    ImageView productImage;
    TextView productName;
    TextView productDesc;
    TextView productPrice;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_productview);

    productToolbar = findViewById(R.id.toolbarTop);
    productImage = findViewById(R.id.product_image);
    productName = findViewById(R.id.product_name);
    productDesc = findViewById(R.id.product_description);
    productPrice = findViewById(R.id.product_price);

    String nameHolder = getIntent().getStringExtra("item Names");
    productName.setText(nameHolder);

    int imageHolder = getIntent().getIntExtra("item Images", -1);
    productImage.setImageResource(imageHolder);

    String descHolder = getIntent().getStringExtra("item Desc");
    productDesc.setText(descHolder);

    String priceHolder = getIntent().getStringExtra("item Price");
    productPrice.setText(priceHolder);

    productToolbar.setTitle("Detail");
    setActionBar(productToolbar);
    getWindow().setStatusBarColor(ContextCompat.getColor(ProductViewActivity.this, R.color.colorProductBackground));

    //backButton as arrow
    if (getActionBar() != null) {
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setDisplayShowHomeEnabled(true);
    }

    Button previewButton = findViewById(R.id.previewButton);
    previewButton.setOnClickListener(view -> openPreview());

    Button addToCartButton = findViewById(R.id.addToCartButton);
    addToCartButton.setOnClickListener(view -> addToCartActivity());
}
//click on Arrow to go back to last Activity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // handle arrow click here
    if (item.getItemId() == android.R.id.home) {
        finish(); // close this activity and return to preview activity (if there is any)
    }
    return super.onOptionsItemSelected(item);
}
public void openPreview (){

    Intent intent = new Intent(this, ArFragmentPreview.class);
    startActivity(intent);
}

public void addToCartActivity (){

    try {
        Cart cartItem = new Cart();
        cartItem.name = productName.getText().toString();
        cartItem.description = productDesc.getText().toString();
        cartItem.price = productPrice.getText().toString();

        MainActivity.cartRepository.insertToCart(cartItem);
        Log.d("MyAR", new Gson().toJson(cartItem));
        Toast.makeText(this, "Save Item to Cart successful", Toast.LENGTH_SHORT).show();
    }
    catch (Exception ex)
    {
        Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
    }

}

}
下面是与每个产品对应的my 3d对象列表

ProductViewActivity.java

package com.example.myar;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;

import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

import com.nex3z.notificationbadge.NotificationBadge;


public class ProductFragment extends Fragment {

private NotificationBadge badge;
package com.example.myar;

import android.content.Intent;
import android.os.Bundle;

import android.util.Log;
import android.view.MenuItem;

import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;


import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;

import com.example.myar.RoomDatabase.ModelDB.Cart;
import com.google.gson.*;


public class ProductViewActivity extends FragmentActivity {
    Toolbar productToolbar;
    ImageView productImage;
    TextView productName;
    TextView productDesc;
    TextView productPrice;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_productview);

    productToolbar = findViewById(R.id.toolbarTop);
    productImage = findViewById(R.id.product_image);
    productName = findViewById(R.id.product_name);
    productDesc = findViewById(R.id.product_description);
    productPrice = findViewById(R.id.product_price);

    String nameHolder = getIntent().getStringExtra("item Names");
    productName.setText(nameHolder);

    int imageHolder = getIntent().getIntExtra("item Images", -1);
    productImage.setImageResource(imageHolder);

    String descHolder = getIntent().getStringExtra("item Desc");
    productDesc.setText(descHolder);

    String priceHolder = getIntent().getStringExtra("item Price");
    productPrice.setText(priceHolder);

    productToolbar.setTitle("Detail");
    setActionBar(productToolbar);
    getWindow().setStatusBarColor(ContextCompat.getColor(ProductViewActivity.this, R.color.colorProductBackground));

    //backButton as arrow
    if (getActionBar() != null) {
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setDisplayShowHomeEnabled(true);
    }

    Button previewButton = findViewById(R.id.previewButton);
    previewButton.setOnClickListener(view -> openPreview());

    Button addToCartButton = findViewById(R.id.addToCartButton);
    addToCartButton.setOnClickListener(view -> addToCartActivity());
}
//click on Arrow to go back to last Activity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // handle arrow click here
    if (item.getItemId() == android.R.id.home) {
        finish(); // close this activity and return to preview activity (if there is any)
    }
    return super.onOptionsItemSelected(item);
}
public void openPreview (){

    Intent intent = new Intent(this, ArFragmentPreview.class);
    startActivity(intent);
}

public void addToCartActivity (){

    try {
        Cart cartItem = new Cart();
        cartItem.name = productName.getText().toString();
        cartItem.description = productDesc.getText().toString();
        cartItem.price = productPrice.getText().toString();

        MainActivity.cartRepository.insertToCart(cartItem);
        Log.d("MyAR", new Gson().toJson(cartItem));
        Toast.makeText(this, "Save Item to Cart successful", Toast.LENGTH_SHORT).show();
    }
    catch (Exception ex)
    {
        Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
    }

}

}
ArFragmentPreview

package com.example.myar;

import android.net.Uri;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.widget.Button;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.ar.sceneform.collision.Box;
import com.google.ar.sceneform.ux.ArFragment;
import com.google.ar.core.Anchor;
import com.google.ar.core.HitResult;
import com.google.ar.core.Plane;
import com.google.ar.sceneform.AnchorNode;
import com.google.ar.sceneform.Camera;
import com.google.ar.sceneform.Node;
import com.google.ar.sceneform.Sun;
import com.google.ar.sceneform.math.Quaternion;
import com.google.ar.sceneform.math.Vector3;
import com.google.ar.sceneform.rendering.ModelRenderable;
import com.google.ar.sceneform.ux.TransformableNode;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class ArFragmentPreview extends AppCompatActivity {

private ArFragment arFragment;
public Plane.Type planeType;
ModelRenderable Fox, Vase, Plant;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_arpreview_layout);
    arFragment = (ArFragment)getSupportFragmentManager().findFragmentById(R.id.arFragment);
    arFragment.setOnTapArPlaneListener((HitResult hitResult, Plane plane, MotionEvent motionEvent) -> {
我只能在AR中渲染此文件

//AR应用程序中的可渲染模式
ModelRenderable.builder()
.setSource(这个Uri.parse(“ArcticFox_Posed.sfb”))
.build()
.thenAccept(modelRenderable->addModelToScene(modelRenderable,hitResult,planeType))
.例外情况下(可丢弃->{
Toast Toast=Toast.makeText(这是“无法加载andy renderable”,Toast.LENGTH\u LONG);
toast.setGravity(Gravity.CENTER,0,0);
toast.show();
返回null;
});
按钮backButton=findViewById(R.id.backButton);
setOnClickListener(v->this.finish());
按钮clearButton=findViewById(R.id.clearButton);
setOnClickListener(视图->onClear());
}
私有void addModelToScene(ModelRenderable ModelRenderable,HitResult HitResult,Plane.Type planeType){
Anchor Anchor=hitResult.createAnchor();
锚点节点锚点节点=新锚点节点(锚点);
setParent(arFragment.getArSceneView().getsceneview());
Vector3 size=((框)modelRenderable.getCollisionShape()).getSize();
TransformableNode TransformableNode=新的TransformableNode(arFragment.getTransformationSystem());
transformableNode.setParent(anchorNode);
arFragment.getArSceneView().getScene().addChild(anchorNode);
if(planeType==平面类型水平面(向下){
transformableNode.setParent(transformableNode);
transformableNode.setLocalPosition(新向量3(0,size.y,0));
setLocalRotation(新的四元数(0,0,1,0));
transformableNode.setRenderable(modelRenderable);
transformableNode.select();
}else if(planeType==Plane.Type.VERTICAL){
transformableNode.setParent(transformableNode);
//setLookDirection(新向量3(0,0,0));
transformableNode.setRenderable(modelRenderable);
transformableNode.select();
}否则{
transformableNode.setRenderable(modelRenderable);
transformableNode.select();
}
}
私有void onClear(){
List children=new ArrayList(arFragment.getArSceneView().getsceneview().getChildren());
用于(节点:子节点){
if(锚点节点的节点实例){
if(((AnchorNode)节点).getAnchor()!=null){
Objects.requireNonNull(((AnchorNode)节点).getAnchor()).detach();
}
}
if(!(相机的节点实例)和&!(太阳的节点实例)){
node.setParent(空);
}
}
}
}

您可以尝试在JMonkey中打开项目,并检查调试器/编译日志中的输出或警告,如果失败,请检查所有访问修饰符,并确保在新模型出现之前,焦点不会从公共类留在私有类中

不,我的意思是我的项目是完全好的,到目前为止没有错误。但问题是,我正在努力选择一种合适的编码方法,以便调用与列表中不同产品对应的不同3D对象:)谢谢你的回答